usr/src/cmd/auto-install/checkpoints/target_selection.py
author Matt Keenan <matt.keenan@oracle.com>
Mon, 11 Jul 2011 14:14:05 +0100
changeset 1266 6b6ba78c5310
parent 1252 131154a3dcbe
child 1273 c4a56398929a
permissions -rw-r--r--
7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
     1
#!/usr/bin/python
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
     2
#
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
     3
# CDDL HEADER START
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
     4
#
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
     8
#
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    12
# and limitations under the License.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    13
#
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    19
#
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    20
# CDDL HEADER END
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    21
#
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    22
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    23
#
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    24
# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    25
#
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    26
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    27
''' target_selection.py - Select Install Target(s)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    28
'''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    29
import copy
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    30
import os
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    31
import platform
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    32
import re
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    33
import traceback
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    34
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    35
from operator import attrgetter
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    36
import osol_install.errsvc as errsvc
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    37
from solaris_install.engine import InstallEngine
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    38
from solaris_install.engine.checkpoint import AbstractCheckpoint as Checkpoint
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    39
from solaris_install.target import Target, vdevs
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    40
from solaris_install.target.controller import TargetController, \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    41
    DEFAULT_VDEV_NAME, SwapDumpGeneralError, SwapDumpSpaceError
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    42
from solaris_install.target.logical import Logical, Zpool, Vdev, BE, Zvol, \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    43
    Filesystem, DatasetOptions, PoolOptions
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    44
from solaris_install.target.physical import Disk, Partition, Slice
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    45
from solaris_install.target.size import Size
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    46
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    47
DISK_RE = "c\d+(?:t\d+)?d\d+"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    48
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    49
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    50
class SelectionError(Exception):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    51
    '''Error generated when any selection problems occur'''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    52
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    53
    def __init__(self, msg):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    54
        Exception.__init__(self)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    55
        self.msg = msg
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    56
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    57
    def __str__(self):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    58
        return self.msg
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    59
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    60
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    61
class TargetSelection(Checkpoint):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    62
    '''TargetSelection - Checkpoint to select install target.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    63
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    64
       This checkpoint attempts to select the install target(s) based on
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    65
       the information provided in the discovered targets and the target
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    66
       information provided in the AI Manifest.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    67
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    68
       If it's not possible to determine a selection, then a SelectionError
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    69
       exception will be raised, causing the installation to fail.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    70
    '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    71
    RAIDZ_REDUNDANCY = ['raidz', 'raidz1', 'raidz2', 'raidz3']
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    72
    TOPLEVEL_REDUNDANCY = ['none', 'mirror']
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    73
    TOPLEVEL_REDUNDANCY.extend(RAIDZ_REDUNDANCY)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    74
    INVALID_ROOT_VDEV = ['log', 'logmirror']
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    75
    PRESERVED = ['preserve', 'use_existing']
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    76
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    77
    def __init__(self, name, be_mountpoint="/a"):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    78
        super(TargetSelection, self).__init__(name)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    79
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    80
        # instance attributes
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    81
        self.be_mountpoint = be_mountpoint
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    82
        self.doc = InstallEngine.get_instance().data_object_cache
1252
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
    83
        self.dry_run = False
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    84
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    85
        # Initialize TargetController
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    86
        self.controller = TargetController(self.doc)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    87
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    88
        # Cache of Discovered Tree, Disks  in the DOC, will be filled in later
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    89
        self._discovered = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    90
        self._discovered_disks = list()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    91
        self._discovered_zpools = list()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    92
        self._discovered_zpool_map = dict()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    93
        self._remaining_zpool_map = dict()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    94
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    95
        self.__reset_maps()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    96
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    97
    def __reset_maps(self):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    98
        '''Reset all local map information to default values
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
    99
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   100
        # Whether swap/dump is to be created, noswap = Don't create swap
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   101
        self._nozpools = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   102
        self._noswap = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   103
        self._nodump = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   104
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   105
        # Cache of various information useful during parsing of manifest info
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   106
        self._root_pool = None     # Should be only one root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   107
        self._be = None            # Should be only one BE
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   108
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   109
        self._is_generated_root_pool = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   110
        self._root_vdev = None     # Will only be set if we create a new rpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   111
                                   # due to none existing in manifest
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   112
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   113
        self._swap_zvol_map = dict()  # Map of zpool:swap to Zvol object
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   114
        self._dump_zvol = None   # Can only have one dump device
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   115
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   116
        self._no_logical_disks = list()  # List of disks with no zpool or vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   117
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   118
        # Assuming only one target object per manifest.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   119
        # If supporting more than one target, these will become lists
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   120
        # of dictionaries accessed via a target index.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   121
        self._zpool_map = dict()   # Map of zpool names to Zpool object
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   122
        self._vdev_map = dict()    # Map of zpool:vdev names to Vdev objects
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   123
        self._vdev_added_map = dict()  # Map of zpool:vdev names we added
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   124
        self._zvol_map = dict()    # Map of zpool:zvols names to Zvol objects
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   125
        self._fs_map = dict()      # Map of zpool:datasets to Dataset objects
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   126
        self._pool_options = dict()  # Map of zpool names to PoolOption objects
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   127
        self._dataset_options = dict()  # Map of zpool names to DatasetOptions
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   128
        self._disk_map = dict()      # Map of disks to Disk objects
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   129
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   130
    def __find_disk(self, disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   131
        '''Find a disk matching some criteria
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   132
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   133
           Disk can be identified in the following order of preference :
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   134
               1. disk.ctd (device name)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   135
               2. disk.volid (volume name)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   136
               3. disk.devid (device id)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   137
               4. disk.devpath (device path)
1197
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   138
               5. disk.receptacle (disk silk screen name)
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   139
               6. disk.is_boot_disk() (contains keyword "boot_disk")
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   140
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   141
               7. If None of the above are specified, a disk can be
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   142
                  identified via any/all of the three disk properties:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   143
                    - dev_type
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   144
                    - dev_vendor
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   145
                    - dev_size
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   146
                  In this scenario, first matching disk will be returned.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   147
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   148
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   149
        for discovered_disk in self._discovered_disks:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   150
            # Attempt to match ctd/volid/devpath/devid first
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   151
            if discovered_disk.name_matches(disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   152
                return discovered_disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   153
1197
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   154
            # Attempt to match disk_prop.  Only match disk properties if all
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   155
            # ctd/volid/devpath/devid/receptacle are None, then attempt to
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   156
            # match on boot disk or one of the disk properties if specified
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   157
            if disk.ctd is None and disk.volid is None and \
1197
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   158
               disk.devpath is None and disk.devid is None and \
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   159
               disk.receptacle is None:
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   160
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   161
                # Attempt to match disk_prop. Any of the properties
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   162
                # dev_type/dev_vendor/dev_size must been specified
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   163
                if discovered_disk.disk_prop is not None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   164
                    disk.disk_prop is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   165
                    if discovered_disk.disk_prop.prop_matches(disk.disk_prop):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   166
                        return discovered_disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   167
1197
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   168
                # Attempt to match on boot_disk
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   169
                if disk.is_boot_disk() and discovered_disk.is_boot_disk():
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   170
                    return discovered_disk
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   171
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   172
        return None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   173
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   174
    @staticmethod
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   175
    def __is_iterable(obj):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   176
        '''Test if an object is iterable'''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   177
        try:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   178
            i = iter(obj)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   179
            return True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   180
        except TypeError:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   181
            return False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   182
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   183
    def __pretty_print_disk(self, disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   184
        '''Print disk identifier rather than whole disk's str()'''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   185
        if self.__is_iterable(disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   186
            ret_str = ""
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   187
            for _disk in disk:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   188
                if len(ret_str) != 0:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   189
                    ret_str += ", "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   190
                ret_str += self.__pretty_print_disk(_disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   191
                return ret_str
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   192
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   193
            if isinstance(disk, Disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   194
                if disk.ctd is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   195
                    return "%s" % disk.ctd
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   196
                if disk.volid is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   197
                    return "[volid='%s']" % disk.volid
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   198
                if disk.devpath is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   199
                    return "[devpath='%s']" % disk.devpath
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   200
                if disk.devid is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   201
                    return "[devid='%s']" % disk.devid
1197
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   202
                if disk.receptacle is not None:
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   203
                    return "[receptacle='%s']" % disk.receptacle
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   204
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   205
                if disk.disk_prop is not None:
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   206
                    disk_props = list()
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   207
                    if disk.disk_prop.dev_type is not None:
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   208
                        disk_props.append(
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   209
                            "dev_type='%s'" % (disk.disk_prop.dev_type))
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   210
                    if disk.disk_prop.dev_vendor is not None:
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   211
                        disk_props.append(
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   212
                            "dev_vendor='%s'" % (disk.disk_prop.dev_vendor))
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   213
                    if disk.disk_prop.dev_chassis is not None:
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   214
                        disk_props.append(
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   215
                            "dev_chassis='%s'" %
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   216
                            (disk.disk_prop.dev_chassis))
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   217
                    if disk.disk_prop.dev_size is not None:
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   218
                        disk_props.append(
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   219
                            "dev_size='%s'" %
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   220
                            (str(disk.disk_prop.dev_size.sectors) +
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   221
                             Size.sector_units))
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   222
                    if disk_props:
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   223
                        disk_props_str = "[" + ",".join(disk_props) + "]"
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   224
                        return disk_props_str
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   225
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   226
                # All else fails, maybe looking for boot-disk?
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   227
                if disk.is_boot_disk():
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   228
                    return "[boot-disk]"
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   229
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
   230
        return str(disk)
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   231
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   232
    def __handle_vdev(self, vdev):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   233
        '''Create Vdev object
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   234
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   235
        self.logger.debug("Processing Vdev '%s', redundancy='%s'" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   236
            (vdev.name, vdev.redundancy))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   237
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   238
        new_vdev = copy.copy(vdev)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   239
        return new_vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   240
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   241
    def __handle_filesystem(self, fs):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   242
        '''Create Filesystem Object
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   243
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   244
        self.logger.debug("Processing Filesystem '%s', action='%s', "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   245
            "mountpoint='%s'" % (fs.name, fs.action, fs.mountpoint))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   246
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   247
        new_fs = copy.copy(fs)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   248
        return new_fs
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   249
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   250
    def __handle_zvol(self, zvol):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   251
        '''Create Zvol object
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   252
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   253
        self.logger.debug("Processing Zvol '%s', action='%s', use='%s'" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   254
            (zvol.name, zvol.action, zvol.use))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   255
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   256
        new_zvol = copy.copy(zvol)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   257
        return new_zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   258
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   259
    def __handle_pool_options(self, pool_options):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   260
        '''Create PoolOptions object
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   261
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   262
        self.logger.debug("Processing Pool Options '%s'" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   263
            (pool_options.options))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   264
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   265
        new_pool_options = copy.copy(pool_options)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   266
        return new_pool_options
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   267
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   268
    def __handle_dataset_options(self, dataset_options):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   269
        '''Create DatasetOption object
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   270
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   271
        self.logger.debug("Processing Dataset Options '%s'" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   272
            (dataset_options.options))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   273
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   274
        new_dataset_options = copy.copy(dataset_options)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   275
        return new_dataset_options
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   276
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   277
    def __handle_be(self, be):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   278
        '''Create BE object, set mountpoint to that passed in
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   279
           to target_selection init.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   280
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   281
        self.logger.debug("Processing BE '%s'" % (be.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   282
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   283
        new_be = copy.copy(be)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   284
        new_be.mountpoint = self.be_mountpoint
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   285
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   286
        return new_be
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   287
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   288
    def __handle_zpool(self, zpool, logical):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   289
        '''Process all zpool children, handling each child object type
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   290
           and returning Zpool object
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   291
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   292
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   293
        self.logger.debug("Processing Zpool '%s', action='%s', is_root='%s',"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   294
            " mountpoint='%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   295
            (zpool.name, zpool.action, zpool.is_root, zpool.mountpoint))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   296
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   297
        this_be = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   298
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   299
        if zpool.name in self._zpool_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   300
            raise SelectionError("Zpool '%s' specified twice" % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   301
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   302
        vdev_count = 0
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   303
        new_zpool = copy.copy(zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   304
        logical.insert_children(new_zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   305
        for child in zpool.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   306
            if isinstance(child, Vdev):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   307
                new_vdev = self.__handle_vdev(child)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   308
                if new_vdev is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   309
                    vdev_key = new_zpool.name + ":" + new_vdev.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   310
                    if vdev_key not in self._vdev_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   311
                        self._vdev_map[vdev_key] = new_vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   312
                        self.logger.debug("Adding Vdev '%s' to zpool" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   313
                            (new_vdev.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   314
                        new_zpool.insert_children(new_vdev)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   315
                        vdev_count += 1
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   316
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   317
                        raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   318
                            "Vdev '%s' specified twice in zpool '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   319
                            (new_vdev.name, new_zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   320
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   321
                    raise SelectionError("Failed to copy Vdev.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   322
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   323
            elif isinstance(child, Filesystem):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   324
                new_fs = self.__handle_filesystem(child)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   325
                if new_fs is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   326
                    if new_fs.action == "preserve" and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   327
                        new_zpool.action not in self.PRESERVED:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   328
                        raise SelectionError("Filesystem '%s' cannot be "
1227
4ecf733307ad 7058653 undefined variable disk_kd and discovered_disk in checkpoints/target_selection.py
Drew Fisher <drew.fisher@oracle.com>
parents: 1197
diff changeset
   329
                            "preserved in non-preserved zpool '%s'." % \
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   330
                            (new_fs.name, new_zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   331
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   332
                    fs_key = new_zpool.name + ":" + new_fs.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   333
                    # Filesystem name must be unique within each pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   334
                    if fs_key not in self._fs_map and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   335
                        fs_key not in self._zvol_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   336
                        self._fs_map[fs_key] = new_fs
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   337
                        self.logger.debug("Adding Filesystem '%s' to zpool" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   338
                            (new_fs.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   339
                        new_zpool.insert_children(new_fs)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   340
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   341
                        raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   342
                            "Filesystem '%s' specified twice in zpool '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   343
                            (new_fs.name, new_zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   344
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   345
                    raise SelectionError("Failed to copy Filesystem.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   346
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   347
            elif isinstance(child, Zvol):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   348
                new_zvol = self.__handle_zvol(child)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   349
                if new_zvol is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   350
                    if new_zvol.action in self.PRESERVED and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   351
                        new_zpool.action not in self.PRESERVED:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   352
                        raise SelectionError("Zvol '%s' cannot be "
1227
4ecf733307ad 7058653 undefined variable disk_kd and discovered_disk in checkpoints/target_selection.py
Drew Fisher <drew.fisher@oracle.com>
parents: 1197
diff changeset
   353
                            "preserved in non-preserved zpool '%s'." % \
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   354
                            (new_zvol.name, zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   355
                    zvol_key = new_zpool.name + ":" + new_zvol.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   356
                    # Zvol name must be unique within each pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   357
                    if zvol_key not in self._zvol_map and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   358
                        zvol_key not in self._fs_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   359
                        if new_zvol.use == "swap":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   360
                            # Cannot specify Swap Zvol and noswap == true
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   361
                            if self._noswap:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   362
                                if zpool.action in self.PRESERVED:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   363
                                    raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   364
                                        "Swap zvol already exists and "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   365
                                        "noswap specified in manifest.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   366
                                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   367
                                    raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   368
                                        "Both swap zvol and noswap specified "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   369
                                        "in manifest.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   370
                            self._swap_zvol_map[zvol_key] = new_zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   371
                        elif new_zvol.use == "dump":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   372
                            # Can only specify one Dump Zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   373
                            if self._dump_zvol is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   374
                                raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   375
                                    "Dump zvol specified twice.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   376
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   377
                            # Cannot specify Dump Zvol and nodump == true
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   378
                            if self._nodump:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   379
                                if zpool.action in self.PRESERVED:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   380
                                    raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   381
                                        "Dump zvol already exists and "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   382
                                        "nodump specified in manifest.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   383
                                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   384
                                    raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   385
                                        "Both dump zvol and nodump specified "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   386
                                        "in manifest.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   387
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   388
                            # Cannot delete a dump zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   389
                            if new_zvol.action == "delete":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   390
                                self.__raise_dump_zvol_deletion_exception()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   391
                            self._dump_zvol = new_zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   392
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   393
                        self._zvol_map[zvol_key] = new_zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   394
                        self.logger.debug("Adding Zvol '%s' to zpool" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   395
                            (new_zvol.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   396
                        new_zpool.insert_children(new_zvol)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   397
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   398
                        raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   399
                            "Zvol '%s' specified twice in zpool '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   400
                            (new_zvol.name, new_zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   401
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   402
                    raise SelectionError("Failed to copy Zvol.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   403
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   404
            elif isinstance(child, PoolOptions):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   405
                new_pool_options = self.__handle_pool_options(child)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   406
                if new_pool_options is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   407
                    # Can only specify one pool_options per zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   408
                    if new_zpool.name not in self._pool_options:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   409
                        self._pool_options[new_zpool.name] = new_pool_options
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   410
                        self.logger.debug("Adding Pool Options '%s' to zpool"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   411
                            % (new_pool_options.options))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   412
                        new_zpool.insert_children(new_pool_options)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   413
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   414
                        raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   415
                            "More than one pool_options specified "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   416
                            "zpool '%s'" % (new_zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   417
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   418
                    raise SelectionError("Failed to copy PoolOptions.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   419
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   420
            elif isinstance(child, DatasetOptions):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   421
                # Validate only one dataset options
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   422
                new_dataset_options = self.__handle_dataset_options(child)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   423
                if new_dataset_options is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   424
                    # Can only specify one dataset_options per zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   425
                    if new_zpool.name not in self._dataset_options:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   426
                        self._dataset_options[new_zpool.name] = \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   427
                            new_dataset_options
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   428
                        self.logger.debug("Adding Dataset Options '%s' to "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   429
                            "zpool" % (new_dataset_options.options))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   430
                        new_zpool.insert_children(new_dataset_options)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   431
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   432
                        raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   433
                            "More than one dataset_options specified "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   434
                            "in zpool '%s'" % (new_zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   435
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   436
                    raise SelectionError("Failed to copy DatasetOptions.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   437
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   438
            elif isinstance(child, BE):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   439
                if not zpool.is_root:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   440
                    raise SelectionError("BE cannot be part of non root "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   441
                        "pool '%s'" % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   442
                new_be = self.__handle_be(child)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   443
                if new_be is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   444
                    # BE can only be specified once in entire manifest
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   445
                    if self._be is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   446
                        self._be = new_be
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   447
                        this_be = new_be
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   448
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   449
                        self.logger.debug("Adding BE '%s' to zpool" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   450
                            (new_be.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   451
                        new_zpool.insert_children(new_be)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   452
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   453
                        if this_be is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   454
                            raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   455
                                "More than one BE specified in zpool '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   456
                                (new_zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   457
                        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   458
                            raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   459
                                "Only one BE element allowed per logical.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   460
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   461
                    raise SelectionError("Failed to copy BE.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   462
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   463
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   464
                raise SelectionError("Invalid zpool sub element")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   465
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   466
        if vdev_count == 0:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   467
            # Zpool specified in manifest but no vdevs were specified
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   468
            # Add a default vdev of type mirror to add any disks to later
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   469
            self.logger.debug("No Vdevs found in zpool '%s', adding mirror."
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   470
                % (new_zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   471
            new_vdev = new_zpool.add_vdev(DEFAULT_VDEV_NAME, "mirror")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   472
            vdev_key = new_zpool.name + ":" + new_vdev.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   473
            self._vdev_map[vdev_key] = new_vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   474
            self._vdev_added_map[vdev_key] = new_vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   475
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   476
        return new_zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   477
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   478
    def __handle_preserved_zpool(self, discovered_zpool, zpool):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   479
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   480
            Process all zpool children, handling each child object type
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   481
            and returning Zpool object.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   482
            Preserving a Zpool effectively means maintaining the physical
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   483
            device structure of a zpool, so you cannot add new physical
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   484
            devices via AI, you can however change what's contained on the
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   485
            zpool, e.g. create/delete filesystems/Zvols.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   486
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   487
            Filesystems:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   488
                - Create, must not already exist
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   489
                - Delete, must exist already
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   490
                - Preserve, nothing to do, but must exist already.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   491
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   492
            Zvols:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   493
                - Create, must not already exist
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   494
                - Delete, must exist already
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   495
                - Preserve, nothing to do, but must exist already.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   496
                - use_existing, must exist, and usage must be changing
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   497
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   498
            BE's:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   499
                - Can only be one BE, BE's are not copied from discovered
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   500
                  as there could be laods.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   501
                - Ensure this BE does not exist already, if not specified
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   502
                  Ensure default created BE does not already exist.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   503
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   504
            Dataset Options:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   505
                - Not allowed in AI, user can do this manually, requires
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   506
                  parsing of string options and zfs knowledge of what options
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   507
                  can be applied post pool creation.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   508
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   509
            Pool Options:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   510
                - Not allowed in AI, user can do this manually, requires
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   511
                  parsing of string options and zfs knowledge of what options
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   512
                  can be applied post pool creation.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   513
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   514
        self.logger.debug("Processing %s Zpool '%s', action='%s',"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   515
            " is_root='%s', mountpoint='%s'" % (zpool.action, zpool.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   516
            zpool.action, zpool.is_root, zpool.mountpoint))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   517
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   518
        discovered_bes = self.__get_discovered_be(zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   519
        this_be = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   520
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   521
        discovered_zpool.action = zpool.action
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   522
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   523
        for child in zpool.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   524
            if isinstance(child, Vdev):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   525
                raise SelectionError("Cannot specify vdev's for preserved "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   526
                    "zpool '%s'." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   527
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   528
            elif isinstance(child, Filesystem):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   529
                new_fs = self.__handle_filesystem(child)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   530
                if new_fs is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   531
                    fs_key = zpool.name + ":" + new_fs.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   532
                    # Check if this filesystem already exists as zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   533
                    if fs_key in self._zvol_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   534
                        raise SelectionError("Filesystem '%s' specified on "
1227
4ecf733307ad 7058653 undefined variable disk_kd and discovered_disk in checkpoints/target_selection.py
Drew Fisher <drew.fisher@oracle.com>
parents: 1197
diff changeset
   535
                            "preserved zpool '%s' exists as Zvol." % \
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   536
                            (new_fs.name, zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   537
                    elif fs_key in self._fs_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   538
                        # Only preserve and delete are allowed for existing
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   539
                        if new_fs.action not in ["preserve", "delete"]:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   540
                            raise SelectionError("Filesystem '%s' specified on"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   541
                                " preserved zpool '%s' contains invalid action"
1227
4ecf733307ad 7058653 undefined variable disk_kd and discovered_disk in checkpoints/target_selection.py
Drew Fisher <drew.fisher@oracle.com>
parents: 1197
diff changeset
   542
                                " of '%s'." % \
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   543
                                (new_fs.name, zpool.name, new_fs.action))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   544
                        # Remove discovered item in order to add user specified
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   545
                        discovered_zpool.delete_children(new_fs)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   546
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   547
                        # Only create allowed for new filesystems
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   548
                        if new_fs.action != "create":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   549
                            raise SelectionError("Filesystem '%s' specified on"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   550
                                " preserved zpool '%s' contains invalid action"
1227
4ecf733307ad 7058653 undefined variable disk_kd and discovered_disk in checkpoints/target_selection.py
Drew Fisher <drew.fisher@oracle.com>
parents: 1197
diff changeset
   551
                                " of '%s'." % \
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   552
                                (new_fs.name, zpool.name, new_fs.action))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   553
                        self._fs_map[fs_key] = new_fs
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   554
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   555
                    self.logger.debug("Adding Filesystem '%s' to zpool" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   556
                         (new_fs.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   557
                    discovered_zpool.insert_children(new_fs)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   558
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   559
                    raise SelectionError("Failed to process Filesystem.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   560
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   561
            elif isinstance(child, Zvol):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   562
                new_zvol = self.__handle_zvol(child)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   563
                if new_zvol is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   564
                    zvol_key = zpool.name + ":" + new_zvol.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   565
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   566
                    # Check if This Zvol already exists as filesystem
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   567
                    if zvol_key in self._fs_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   568
                        raise SelectionError("Zvol '%s' specified on "
1227
4ecf733307ad 7058653 undefined variable disk_kd and discovered_disk in checkpoints/target_selection.py
Drew Fisher <drew.fisher@oracle.com>
parents: 1197
diff changeset
   569
                            "preserved zpool '%s' exists as Filesystem." % \
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   570
                            (new_zvol.name, zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   571
                    elif zvol_key in self._zvol_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   572
                        # Only preserve, delete, use_existing are allowed
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   573
                        if new_zvol.action not in \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   574
                            ["preserve", "delete", "use_existing"]:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   575
                            raise SelectionError("Zvol '%s' specified on "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   576
                                "preserved zpool '%s' contains invalid action "
1227
4ecf733307ad 7058653 undefined variable disk_kd and discovered_disk in checkpoints/target_selection.py
Drew Fisher <drew.fisher@oracle.com>
parents: 1197
diff changeset
   577
                                "of '%s'." % \
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   578
                                (new_zvol.name, zpool.name, new_zvol.action))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   579
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   580
                        discovered_zvol = discovered_zpool.get_first_child(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   581
                            new_zvol.name, Zvol)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   582
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   583
                        if discovered_zvol is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   584
                            raise SelectionError("Zvol '%s' not found in "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   585
                                "discovered." % (new_zvol.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   586
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   587
                        if new_zvol.action == "use_existing":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   588
                            if discovered_zvol.use == new_zvol.use:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   589
                                raise SelectionError("Zvol '%s' marked as "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   590
                                    "use_existing but usage has not changed." %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   591
                                    (new_zvol.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   592
                            elif discovered_zvol.use == "dump":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   593
                                # Cannot delete a dump zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   594
                                self.__raise_dump_zvol_deletion_exception()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   595
1227
4ecf733307ad 7058653 undefined variable disk_kd and discovered_disk in checkpoints/target_selection.py
Drew Fisher <drew.fisher@oracle.com>
parents: 1197
diff changeset
   596
                            elif new_zvol.use == "dump":
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   597
                                # Can only specify one Dump Zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   598
                                if self._dump_zvol is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   599
                                    raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   600
                                        "Dump zvol specified twice.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   601
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   602
                                # Cannot specify Dump Zvol and nodump == true
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   603
                                if self._nodump:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   604
                                    raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   605
                                        "Both dump zvol and nodump "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   606
                                        "specified in manifest.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   607
                                # Make a copy of discovered zvol to ensure we
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   608
                                # get same size specification
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   609
                                new_zvol = copy.deepcopy(discovered_zvol)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   610
                                new_zvol.action = "create"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   611
                                new_zvol.use = "dump"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   612
                                self._dump_zvol = new_zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   613
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   614
                            elif new_zvol.use == "swap":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   615
                                # Cannot have Swap Zvol and noswap == true
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   616
                                if self._noswap:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   617
                                    raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   618
                                        "Both swap zvol and noswap "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   619
                                        "specified in manifest.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   620
                                if new_zvol in self._swap_zvol_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   621
                                    raise SelectionError("Zvol '%s' specified "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   622
                                        "as swap twice in preserved zpool "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   623
                                        "'%s'" % (new_zvol.name, zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   624
                                new_zvol = copy.deepcopy(discovered_zvol)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   625
                                new_zvol.action = "create"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   626
                                new_zvol.use = "swap"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   627
                                self._swap_zvol_map[zvol_key] = new_zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   628
                            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   629
                                new_zvol = copy.deepcopy(discovered_zvol)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   630
                                new_zvol.action = "create"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   631
                                new_zvol.use = "none"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   632
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   633
                            if discovered_zvol.use == "swap":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   634
                                # Remove this device from swap map
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   635
                                if new_zvol in self._swap_zvol_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   636
                                    del self._swap_zvol_map[zvol_key]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   637
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   638
                        # Remove discovered item in order to add user specified
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   639
                        discovered_zpool.delete_children(new_zvol)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   640
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   641
                        # Only create allowed for new zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   642
                        if new_zvol.action != "create":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   643
                            raise SelectionError("Zvol '%s' specified on "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   644
                                "preserved zpool '%s' contains invalid action "
1227
4ecf733307ad 7058653 undefined variable disk_kd and discovered_disk in checkpoints/target_selection.py
Drew Fisher <drew.fisher@oracle.com>
parents: 1197
diff changeset
   645
                                "of '%s'." % \
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   646
                                (new_zvol.name, zpool.name, new_zvol.action))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   647
                        self._zvol_map[zvol_key] = new_zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   648
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   649
                    self._zvol_map[zvol_key] = new_zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   650
                    self.logger.debug("Adding Zvol '%s' to zpool" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   651
                        (new_zvol.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   652
                    discovered_zpool.insert_children(new_zvol)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   653
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   654
                    raise SelectionError("Failed to copy Zvol.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   655
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   656
            elif isinstance(child, PoolOptions):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   657
                raise SelectionError("Cannot specify Pool Option's for "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   658
                    "preserved zpool '%s'." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   659
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   660
            elif isinstance(child, DatasetOptions):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   661
                raise SelectionError("Cannot specify Dataset Option's for "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   662
                    "preserved zpool '%s'." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   663
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   664
            elif isinstance(child, BE):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   665
                if not zpool.is_root:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   666
                    raise SelectionError("BE cannot be part of non root "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   667
                        "pool '%s'" % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   668
                new_be = self.__handle_be(child)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   669
                if new_be is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   670
                    # Ensure this boot environment does not exist on
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   671
                    # this preserved/use_existing zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   672
                    if new_be.exists:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   673
                        raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   674
                                "BE '%s' specified in preserved "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   675
                                "zpool '%s' already exists. To install to "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   676
                                "existing zpool you must specify a unique "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   677
                                "BE in the manifest." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   678
                                (new_be.name, zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   679
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   680
                    # BE can only be specified once in entire manifest
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   681
                    if self._be is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   682
                        self._be = new_be
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   683
                        this_be = new_be
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   684
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   685
                        self.logger.debug("Adding BE '%s' to zpool" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   686
                            (new_be.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   687
                        discovered_zpool.insert_children(new_be)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   688
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   689
                        if this_be is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   690
                            raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   691
                                "More than one BE specified in zpool '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   692
                                (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   693
                        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   694
                            raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   695
                                "Only one BE element allowed per logical.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   696
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   697
                    raise SelectionError("Failed to copy BE.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   698
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   699
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   700
                raise SelectionError("Invalid zpool sub element")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   701
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   702
    def __handle_logical(self, logical):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   703
        '''Create Logical structure from manifest, validating
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   704
           zpools and contents in the process
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   705
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   706
        # Clear the Error service
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   707
        errsvc.clear_error_list()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   708
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   709
        self.logger.debug("Processing Logical noswap : %s, nodump : %s" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   710
            (logical.noswap, logical.nodump))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   711
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   712
        # Set whether to specifically not create swap/dump
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   713
        self._noswap = logical.noswap
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   714
        self._nodump = logical.nodump
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   715
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   716
        new_logical = copy.copy(logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   717
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   718
        preserving_zpools = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   719
        for zpool in logical.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   720
            # This will always be true as Logical can only contain zpools
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   721
            if isinstance(zpool, Zpool):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   722
                if zpool.action in self.PRESERVED:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   723
                    preserving_zpools = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   724
                    disc_zpool = self.__get_discovered_zpool(zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   725
                    if disc_zpool is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   726
                        raise SelectionError("Failed to find zpool '%s' in "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   727
                            "discovered logical tree." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   728
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   729
                    if zpool.action == "use_existing" and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   730
                        not disc_zpool.is_root:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   731
                        raise SelectionError("Specified action of "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   732
                            "'use_existing' on pool '%s' is invalid. '%s' "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   733
                            "is not a root pool." % (zpool.name, zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   734
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   735
                    new_zpool = self.__handle_zpool(disc_zpool, new_logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   736
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   737
                    # Copy physical devices to desired
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   738
                    self.__copy_zpool_discovered_devices(new_zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   739
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   740
                    new_zpool = self.__handle_zpool(zpool, new_logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   741
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   742
                if new_zpool is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   743
                    if new_zpool.name not in self._zpool_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   744
                        if new_zpool.is_root:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   745
                            # Only one root pool can be specified
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   746
                            if self._root_pool is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   747
                                raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   748
                                    "Root pool specified twice")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   749
                            self.logger.debug("Root zpool found '%s'" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   750
                                (new_zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   751
                            self._root_pool = new_zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   752
                        self.logger.debug("Adding zpool '%s' to logical" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   753
                            (new_zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   754
                        self._zpool_map[new_zpool.name] = new_zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   755
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   756
                        raise SelectionError("Zpool '%s' specified twice" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   757
                            (new_zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   758
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   759
                if zpool.action in self.PRESERVED:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   760
                    self.__handle_preserved_zpool(new_zpool, zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   761
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   762
                raise SelectionError("Invalid logical child.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   763
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   764
        if preserving_zpools:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   765
            # Need to update all devices, and remove any references to
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   766
            # Zpools that do not exist.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   767
            self.__remove_invalid_zpool_references(new_logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   768
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   769
        if self._zpool_map is None or len(self._zpool_map) == 0:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   770
            self._nozpools = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   771
            new_logical = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   772
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   773
        # Check error service for errors
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   774
        errors = errsvc.get_all_errors()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   775
        if errors:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   776
            existing_desired = \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   777
                self.doc.persistent.get_first_child(Target.DESIRED)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   778
            if existing_desired:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   779
                self.logger.debug("Desired =\n%s\n" % (str(existing_desired)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   780
            errstr = "Following errors occurred processing logical :\n%s" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   781
                (str(errors[0]))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   782
            raise SelectionError(errstr)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   783
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   784
        return new_logical
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   785
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   786
    def __raise_dump_zvol_deletion_exception(self):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   787
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   788
            Dump zvol's cannot be unassigned from being a dump device.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   789
            Bug 6910925 is addressing this issue, however until resolved
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   790
            we have to trap and tell the user that this is not possible.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   791
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   792
        self.logger.debug("Workaround for releaseing Zvol as dump device.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   793
        self.logger.debug("Create a new Zvol on another pool, and assign ")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   794
        self.logger.debug("this Zvol as the dump device. The original dump")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   795
        self.logger.debug("assigned Zvol and it's pool can now be destroyed.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   796
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   797
        raise SelectionError("Dump device cannot be unassigned. Due to "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   798
            "RFE 6910925. See install_log for workaround.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   799
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   800
    def __remove_invalid_zpool_references(self, logical):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   801
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   802
            Process all physical devices, remove any references to in_zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   803
            in_vdev referencing pools not in this logical tree.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   804
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   805
            Whilst processing the disks add them to the internal maps.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   806
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   807
            At this stage self._zpool_map will have been populated.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   808
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   809
        # Cycle through all desired physical disks checking what pool if
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   810
        # any these disks/devices are assigned to.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   811
        # If the pool does not exist in this logical, then reset their
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   812
        # in_zpool and in_vdev attributes to None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   813
        new_desired_target = self.__get_new_desired_target()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   814
        desired_disks = new_desired_target.get_descendants(class_type=Disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   815
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   816
        for disk in desired_disks:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   817
            if disk.in_zpool is not None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   818
                disk.in_zpool not in self._zpool_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   819
                disk.in_zpool = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   820
                disk.in_vdev = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   821
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   822
            # Process any children and ensure they are unset aswell
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   823
            for disk_kid in disk.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   824
                if (isinstance(disk_kid, Partition) or \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   825
                    isinstance(disk_kid, Slice)) and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   826
                    disk_kid.in_zpool is not None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   827
                    disk_kid.in_zpool not in self._zpool_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   828
                    disk_kid.in_zpool = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   829
                    disk_kid.in_vdev = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   830
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   831
                if isinstance(disk_kid, Partition):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   832
                    for slc in disk_kid.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   833
                        if isinstance(slc, Slice) and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   834
                            slc.in_zpool is not None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   835
                            slc.in_zpool not in self._zpool_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   836
                            slc.in_zpool = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   837
                            slc.in_vdev = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   838
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   839
        # Add all these disks to map
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   840
        self.__add_disks_to_map(desired_disks)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   841
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   842
    def __add_disks_to_map(self, disks):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   843
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   844
            Given a list of disks, add them to the intermal disk map.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   845
            Throwing exception if disk has already been added.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   846
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   847
        for disk in disks:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   848
            if disk.ctd in self._disk_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   849
                # Seems that the disk is specified more than once in
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   850
                # the manifest!
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   851
                raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   852
                    "Disk '%s' matches already used disk '%s'." %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   853
                    (self.__pretty_print_disk(disk), disk.ctd))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   854
            self._disk_map[disk.ctd] = disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   855
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   856
    def __get_discovered_be(self, zpool):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   857
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   858
            Retrieve the list of boot environments for a specific discovered
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   859
            zpool.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   860
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   861
        discovered = self.doc.persistent.get_first_child(Target.DISCOVERED)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   862
        discovered_zpools = discovered.get_descendants(name=zpool.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   863
            class_type=Zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   864
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   865
        if not discovered_zpools:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   866
            return None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   867
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   868
        found_be = discovered_zpools[0].get_descendants(class_type=BE)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   869
        return found_be
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   870
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   871
    def __get_discovered_zpool(self, zpool):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   872
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   873
            Process list of discovered zpools for matching zpool.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   874
            Return None if not found or zpool object if found.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   875
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   876
        discovered = self.doc.persistent.get_first_child(Target.DISCOVERED)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   877
        discovered_zpools = discovered.get_descendants(name=zpool.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   878
            class_type=Zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   879
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   880
        if not discovered_zpools:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   881
            return None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   882
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   883
        found_zpool = copy.deepcopy(discovered_zpools[0])
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   884
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   885
        # Remove BE's as they cannot be preserved/recreated via AI
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   886
        found_zpool.delete_children(class_type=BE)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   887
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   888
        return found_zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   889
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   890
    def __copy_zpool_discovered_devices(self, zpool):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   891
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   892
            For zpools being preserved, copy all devices associated with
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   893
            this zpool into desired tree.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   894
            When copying devices, entire disk tree needs to be copied if
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   895
            any part of the disk resides on this zpool, by default all elements
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   896
            are set to "preserved", so nothing will get destroyed, TI needs
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   897
            to have all elements of the disk tree structure or it will wipe
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   898
            them.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   899
            Throw exception if after processing all physical devices, and
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   900
            none were found for this zpool.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   901
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   902
        new_desired_target = self.__get_new_desired_target()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   903
        discovered = self.doc.persistent.get_first_child(Target.DISCOVERED)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   904
        discovered_disks = discovered.get_descendants(class_type=Disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   905
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   906
        device_found = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   907
        for disk in discovered_disks:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   908
            disk_copy = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   909
            disk_found = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   910
            if disk.in_zpool is not None and disk.in_zpool == zpool.name:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   911
                # Copy entire disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   912
                disk_copy = copy.deepcopy(disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   913
                disk_found = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   914
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   915
                for disk_kid in disk.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   916
                    if isinstance(disk_kid, Partition):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   917
                        if disk_kid.in_zpool is not None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   918
                            disk_kid.in_zpool == zpool.name:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   919
                            disk_found = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   920
                            break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   921
                        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   922
                            for slc in disk_kid.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   923
                                if isinstance(slc, Slice):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   924
                                    # Only copy if in this zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   925
                                    if slc.in_zpool is not None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   926
                                        slc.in_zpool == zpool.name:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   927
                                        disk_found = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   928
                                        break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   929
1227
4ecf733307ad 7058653 undefined variable disk_kd and discovered_disk in checkpoints/target_selection.py
Drew Fisher <drew.fisher@oracle.com>
parents: 1197
diff changeset
   930
                    elif isinstance(disk_kid, Slice):
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   931
                        if disk_kid.in_zpool is not None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   932
                            disk_kid.in_zpool == zpool.name:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   933
                            disk_found = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   934
                            break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   935
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   936
                if disk_found:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   937
                    disk_copy = copy.deepcopy(disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   938
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   939
            if disk_copy is not None and disk_found:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   940
                # If this is the root pool, make sure solaris partition
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   941
                # is marked as Active, Final Validation fails otherwise
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   942
                if zpool.is_root and platform.processor() == 'i386':
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   943
                    solaris2_part_type = Partition.name_to_num("Solaris2")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   944
                    for disk_kid in disk_copy.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   945
                        if isinstance(disk_kid, Partition) and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   946
                            disk_kid.part_type == solaris2_part_type:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   947
                            disk_kid.bootid = Partition.ACTIVE
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   948
                            break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   949
                new_desired_target.insert_children(disk_copy)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   950
                device_found = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   951
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   952
        if not device_found:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   953
            raise SelectionError("Failed to find any discovered devices for "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   954
                "zpool '%s'." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   955
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   956
    def __validate_zpool_actions(self, zpool):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   957
        '''Perform some validation on zpool actions against
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   958
           root pool and existing zpool's.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   959
           Ensure pool name does not exist as a current directory, it pool does
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   960
           not exist already and is being created.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   961
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   962
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   963
        if zpool.exists:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   964
            # Get zpool discovered object
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   965
            discovered_zpool = self.__get_discovered_zpool(zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   966
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   967
            if discovered_zpool is None:
1252
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
   968
                if self.dry_run:
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
   969
                    # Throw warning only if in dry run mode
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
   970
                    self.logger.warning("zpool.exists() reports zpool '%s' "
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
   971
                        "exists, but zpool object not in Discovered tree." % \
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
   972
                        (zpool.name))
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
   973
                else:
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
   974
                    raise SelectionError("zpool.exists() reports zpool '%s' "
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
   975
                        "exists, but zpool object not in Discovered tree." % \
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
   976
                        (zpool.name))
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   977
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   978
            if zpool.action == "create":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   979
                # Log warning stating zpool will be destroyed
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   980
                self.logger.warning("Existing zpool '%s' will be destroyed."
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   981
                                    % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   982
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   983
            elif zpool.action == "preserve" and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   984
                (zpool.is_root or discovered_zpool.is_root):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   985
                # Manifest specifies to preserve pool, and either manifest
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   986
                # or discovered specify this as root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   987
                raise SelectionError("Invalid preservation specified for "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   988
                    "root zpool '%s'. Use 'use_existing' action." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   989
                    (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   990
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   991
            elif zpool.action == "use_existing":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   992
                # Pool must be a an existing root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   993
                if not discovered_zpool.is_root:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   994
                    raise SelectionError("Cannot specify 'use_existing' "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   995
                        "action for already existing non root zpool '%s'."
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   996
                        % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   997
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   998
                if not zpool.is_root:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
   999
                    raise SelectionError("Cannot specify 'use_existing' "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1000
                        "action on non root zpool '%s'." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1001
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1002
                # Preserving a root pool, let's make sure there is
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1003
                # sufficient space left in this pool for a solaris install
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1004
                zpool_available_size = self.__get_existing_zpool_size(zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1005
                if zpool_available_size < self.controller.minimum_target_size:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1006
                    raise SelectionError("Preserved root pool '%s' has "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1007
                        "available space of '%s', which is insufficient "
1247
e93173cd968b 7059210 Spelling Error: Minimim space required is '5.00gb'. Should be Minimum
Drew Fisher <drew.fisher@oracle.com>
parents: 1227
diff changeset
  1008
                        "space to install to. Minimum space "
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1009
                        "required is '%s'."
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1010
                        % (zpool.name, str(zpool_available_size),
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1011
                        str(self.controller.minimum_target_size)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1012
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1013
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1014
            if zpool.action == "delete":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1015
                self.logger.warning("Manifest specifies to delete non "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1016
                    "existent zpool '%s'." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1017
            elif zpool.action == "preserve":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1018
                raise SelectionError("Cannot 'preserve' non existent zpool "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1019
                    "'%s'." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1020
            elif zpool.action == "use_existing":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1021
                raise SelectionError("Cannot 'use_existing' non existent "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1022
                    "zpool '%s'." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1023
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1024
                # Attempting to create a new Zpool, ensure pool name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1025
                # is not an existing directory as zpool create will fail.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1026
                if os.path.isdir(os.path.join("/", zpool.name)):
1252
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  1027
                    if self.dry_run:
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  1028
                        # Dry run mode, just post warning to log
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  1029
                        self.logger.warning("Pool name '%s' is not valid, "
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  1030
                            "directory exists with this name." % (zpool.name))
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  1031
                    else:
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  1032
                        raise SelectionError("Pool name '%s' is not valid, "
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  1033
                            "directory exists with this name." % (zpool.name))
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1034
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1035
    def __get_existing_zpool_size(self, zpool):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1036
        '''Retrieve the size available for this zpool via the "size"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1037
           zpool property. Returned size is a Size object.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1038
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1039
        if zpool.exists:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1040
            propdict = zpool.get("size")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1041
            retsize = Size(propdict.get("size", "0b"))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1042
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1043
            retsize = Size("0b")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1044
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1045
        return retsize
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1046
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1047
    def __get_zpool_available_size(self, zpool):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1048
        '''Process all the devices in the first toplevel of this zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1049
           returning what the available size for this zpool if created.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1050
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1051
           "none" : concatenate size of all devices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1052
           "mirror", "raidz*" : get size of smallest device
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1053
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1054
           returns Size object
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1055
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1056
        retsize = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1057
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1058
        if zpool.action in self.PRESERVED:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1059
            # Pool is being presreved so no devices in desired,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1060
            # Get size from discovered disks instead
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1061
            retsize = self.__get_existing_zpool_size(zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1062
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1063
            # Get available size from desired targets
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1064
            for vdev in zpool.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1065
                if isinstance(vdev, Vdev):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1066
                    vdev_devices = self.__get_vdev_devices(zpool.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1067
                        vdev.name, self._disk_map)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1068
                    if vdev.redundancy in self.TOPLEVEL_REDUNDANCY and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1069
                        vdev_devices:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1070
                        for device in vdev_devices:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1071
                            if retsize is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1072
                                retsize = copy.copy(device.size)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1073
                            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1074
                                devsize = copy.copy(device.size)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1075
                                if vdev.redundancy == "none":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1076
                                    # Concatenate device sizes together
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1077
                                    retsize = Size(str(retsize.byte_value +
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1078
                                        devsize.byte_value) + Size.byte_units)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1079
                                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1080
                                    # Get size of smallest device
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1081
                                    if devsize < retsize:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1082
                                        retsize = devsize
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1083
                        # Break after first Toplevel vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1084
                        break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1085
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1086
        if retsize is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1087
            raise SelectionError("Could not determine the available size in "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1088
                "pool '%s'." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1089
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1090
        return retsize
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1091
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1092
    def __validate_swap_and_dump(self, desired):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1093
        '''Ensure at least one swap and one dump device exist in logical
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1094
           tree.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1095
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1096
           If none exist, unless noswap or nodump are set to true we will, by
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1097
           default, create one of each in the root pool if sufficient space
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1098
           available.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1099
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1100
        # Get Logical sections
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1101
        logical = desired.get_first_child(class_type=Logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1102
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1103
        if logical is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1104
            # swap :
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1105
            if (not logical.noswap and len(self._swap_zvol_map) == 0) or \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1106
                (not logical.nodump and self._dump_zvol is None):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1107
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1108
                # One or both of swap and dump not already created, get
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1109
                # default type/sizes if we are to create them
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1110
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1111
                # Create swap/dump zvol in root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1112
                swap_added = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1113
                dump_added = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1114
                for zpool in [z for z in logical.children if z.is_root]:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1115
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1116
                    # This needs to be done for on the pool itself as we
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1117
                    # need to process this pool to get the available size
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1118
                    # To install to.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1119
                    try:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1120
                        (swap_type, swap_size, dump_type, dump_size) = \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1121
                            self.controller.calc_swap_dump_size(\
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1122
                                self.controller.minimum_target_size,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1123
                                self.__get_zpool_available_size(zpool))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1124
                    except (SwapDumpGeneralError, SwapDumpSpaceError) as ex:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1125
                        raise SelectionError("Error determining swap/dump "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1126
                            "requirements.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1127
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1128
                    # Only process root pools (should only be one either way)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1129
                    if not logical.noswap and len(self._swap_zvol_map) == 0:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1130
                        # Swap does not exist so attempt to create
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1131
                        if swap_type == self.controller.SWAP_DUMP_ZVOL and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1132
                            swap_size > Size("0b"):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1133
                            zvol_name = self.__get_unique_dataset_name(zpool,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1134
                                                                       "swap")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1135
                            self.__create_swap_dump_zvol(zpool, zvol_name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1136
                                "swap", swap_size)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1137
                            swap_added = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1138
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1139
                    if not logical.nodump and self._dump_zvol is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1140
                        # Dump does not exist so attempt to create
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1141
                        if dump_type == self.controller.SWAP_DUMP_ZVOL and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1142
                            dump_size > Size("0b"):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1143
                            zvol_name = self.__get_unique_dataset_name(zpool,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1144
                                                                       "dump")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1145
                            self.__create_swap_dump_zvol(zpool, zvol_name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1146
                                "dump", dump_size)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1147
                            dump_added = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1148
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1149
                if not swap_added and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1150
                    not logical.noswap and len(self._swap_zvol_map) == 0:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1151
                    self.logger.warning("Failed to add default swap zvol to "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1152
                        "root pool")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1153
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1154
                if not dump_added and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1155
                    not logical.nodump and self._dump_zvol is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1156
                    self.logger.warning("Failed to add default dump zvol to "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1157
                        "root pool")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1158
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1159
    def __get_unique_dataset_name(self, zpool, dataset_name):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1160
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1161
            Ensure this dataset name does not exist in this zpool.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1162
            If it does, then append N to end until unique.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1163
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1164
        unique = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1165
        unique_name = dataset_name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1166
        append_digit = 1
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1167
        while not unique:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1168
            unique = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1169
            for child in zpool.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1170
                if (isinstance(child, Filesystem) or \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1171
                    isinstance(child, Zvol)) and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1172
                    child.name == unique_name:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1173
                    unique_name = dataset_name + str(append_digit)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1174
                    append_digit = append_digit + 1
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1175
                    unique = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1176
                    break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1177
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1178
        return unique_name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1179
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1180
    def __create_swap_dump_zvol(self, zpool, zvol_name, zvol_use, zvol_size):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1181
        '''Create a swap or dump Zvol on a zpool.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1182
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1183
           Input:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1184
               zpool : zpool object to add zvol to
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1185
               zvol_name : Str zvol name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1186
               zvol_use : Str zvol usage, "swap" or "dump"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1187
               zvol_size : Size Object
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1188
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1189
        zvol = zpool.add_zvol(zvol_name, int(zvol_size.get(Size.mb_units)),
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1190
            Size.mb_units, use=zvol_use)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1191
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1192
        if zvol_use == "swap":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1193
            swap_key = zpool.name + ":swap"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1194
            self._swap_zvol_map[swap_key] = zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1195
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1196
            self._dump_zvol = zvol
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1197
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1198
    def __validate_logical(self, desired):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1199
        '''Process Logical components of desired tree ensuring:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1200
           - mirror, at least two devices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1201
           - logmirror, at least two devices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1202
           - raidz1, at least two devices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1203
           - raidz2, at least three devices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1204
           - raidz3, at least four devices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1205
           - Ensure at least one of none|mirror|raidz exists per pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1206
           - Ensure only one BE specified per pool, if none add one.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1207
           - Ensure only one DatasetOptions specified per pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1208
           - Ensure only one PoolOptions specified per pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1209
           - Ensure only one pool is set to root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1210
           - root_pool, ensure single device or if multiple devices,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1211
             redundancy is set to mirror.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1212
           - Root pool cannot contain log or logmirror devices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1213
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1214
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1215
        # Get Logical sections
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1216
        logicals = desired.get_children(class_type=Logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1217
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1218
        # Validate correct number of devices per redundancy
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1219
        for logical in logicals:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1220
            self.logger.debug("Validating desired  logical =\n%s\n" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1221
                (str(logical)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1222
            be = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1223
            found_be = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1224
            found_dataset_options = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1225
            found_pool_options = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1226
            found_root_pool = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1227
            found_swap = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1228
            found_dump = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1229
            self._remaining_zpool_map = \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1230
                self.__compile_remaining_existing_devices_map(logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1231
            for zpool in logical.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1232
                if zpool.is_root:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1233
                    if found_root_pool:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1234
                        raise SelectionError("Root pool specified twice")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1235
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1236
                        found_root_pool = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1237
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1238
                        # Ensure Root pool size is large enough to install to
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1239
                        zpool_available_size = \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1240
                            self.__get_zpool_available_size(zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1241
                        if zpool_available_size < \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1242
                            self.controller.minimum_target_size:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1243
                            raise SelectionError("Root pool '%s' has "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1244
                                "available space of '%s', which is "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1245
                                "insufficient space to install to. "
1247
e93173cd968b 7059210 Spelling Error: Minimim space required is '5.00gb'. Should be Minimum
Drew Fisher <drew.fisher@oracle.com>
parents: 1227
diff changeset
  1246
                                "Minimum space required is '%s'."
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1247
                                % (zpool.name, str(zpool_available_size),
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1248
                                str(self.controller.minimum_target_size)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1249
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1250
                # Perform some validations on zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1251
                # Check if this zpool already exists etc
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1252
                self.__validate_zpool_actions(zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1253
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1254
                found_toplevel = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1255
                for child in zpool.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1256
                    if isinstance(child, Vdev):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1257
                        self.__validate_vdev(zpool, child)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1258
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1259
                        # Ensure something other than log/cache/spare is set
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1260
                        if child.redundancy in self.TOPLEVEL_REDUNDANCY and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1261
                            not found_toplevel:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1262
                            found_toplevel = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1263
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1264
                    elif isinstance(child, BE):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1265
                        if not zpool.is_root:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1266
                            raise SelectionError("BE '%s' cannot be part of "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1267
                                "non root pool '%s'." %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1268
                                (child.name, zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1269
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1270
                        # Verify BE does not already exist
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1271
                        if child.exists:
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1272
                            raise SelectionError("BE '%s' already exists. "
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1273
                                "BE must be unique." % (child.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1274
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1275
                        if found_be:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1276
                            raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1277
                                "More than one BE specified in zpool '%s'." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1278
                                (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1279
                        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1280
                            found_be = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1281
                            be = child
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1282
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1283
                    elif isinstance(child, DatasetOptions):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1284
                        if found_dataset_options:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1285
                            raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1286
                                "More than one dataset_options specified "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1287
                                "in zpool '%s'." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1288
                        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1289
                            found_dataset_options = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1290
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1291
                    elif isinstance(child, PoolOptions):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1292
                        if found_pool_options:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1293
                            raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1294
                                "More than one pool_options specified "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1295
                                "zpool '%s'." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1296
                        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1297
                            found_pool_options = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1298
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1299
                    elif isinstance(child, Zvol):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1300
                        if child.use == "swap":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1301
                            found_swap = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1302
                        elif child.use == "dump":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1303
                            found_dump = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1304
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1305
                # If the pool does not contain any toplevel vdevs throw
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1306
                # exception. For pools marked for deletion not an error.
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1307
                if not found_toplevel and zpool.action != "delete":
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1308
                    raise SelectionError("Must specify at least one toplevel"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1309
                        " child redundancy in pool '%s'." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1310
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1311
                if zpool.is_root:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1312
                    if not found_be:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1313
                        # Root pool with no BE, so insert one
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1314
                        self.logger.debug("Found root pool '%s' with no BE, "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1315
                            "inserting one." % (zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1316
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1317
                        # Ensure BE name is unique and does not exist already
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1318
                        self._be = BE()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1319
                        if self._be.exists:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1320
                            raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1321
                                "BE '%s' specified in zpool '%s' already "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1322
                                "exists. You must specify a unique "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1323
                                "BE in the manifest." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1324
                                (self._be.name, zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1325
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1326
                        self._be.mountpoint = self.be_mountpoint
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1327
                        zpool.insert_children(self._be)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1328
                        found_be = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1329
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1330
                        # Ensure mountpoint is set
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1331
                        if be.mountpoint is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1332
                            be.mountpoint = self.be_mountpoint
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1333
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1334
            if not logical.noswap and not found_swap:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1335
                raise SelectionError("At least one swap Zvol must exist.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1336
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1337
            if not logical.nodump and not found_dump:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1338
                raise SelectionError("At least one dump Zvol must exist.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1339
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1340
            if not found_root_pool:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1341
                raise SelectionError("No root pool specified.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1342
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1343
            if not found_be:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1344
                raise SelectionError("No BE specified.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1345
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1346
    def __validate_vdev(self, zpool, child):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1347
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1348
            Validate Vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1349
            - Ensure correct number of devices for redundancy
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1350
            - Root pool contains correct redundancy type
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1351
            - Preserved pool contains no devices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1352
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1353
        vdev_devices = self.__get_vdev_devices(zpool.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1354
            child.name, self._disk_map)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1355
        self.__validate_vdev_devices(zpool, child,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1356
            vdev_devices)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1357
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1358
        if not zpool.action in self.PRESERVED:
1266
6b6ba78c5310 7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Matt Keenan <matt.keenan@oracle.com>
parents: 1252
diff changeset
  1359
            if not vdev_devices:
6b6ba78c5310 7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Matt Keenan <matt.keenan@oracle.com>
parents: 1252
diff changeset
  1360
                raise SelectionError(
6b6ba78c5310 7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Matt Keenan <matt.keenan@oracle.com>
parents: 1252
diff changeset
  1361
                    "Vdev '%s' on zpool '%s' must contain at least one "
6b6ba78c5310 7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Matt Keenan <matt.keenan@oracle.com>
parents: 1252
diff changeset
  1362
                    "device." % (child.name, zpool.name))
6b6ba78c5310 7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Matt Keenan <matt.keenan@oracle.com>
parents: 1252
diff changeset
  1363
            elif ((not zpool.is_root and
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1364
                child.redundancy == "mirror") or \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1365
                child.redundancy == "logmirror" or
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1366
                child.redundancy == "raidz" or
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1367
                child.redundancy == "raidz1") and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1368
                len(vdev_devices) < 2:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1369
                vdev_key = zpool.name + ":" + child.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1370
                if vdev_key in self._vdev_added_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1371
                    # Data pool where we added default child of
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1372
                    # type mirror, reset to "none"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1373
                    self.logger.debug("Changing data redundancy"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1374
                        " from 'mirror' to 'none'.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1375
                    child.redundancy = "none"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1376
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1377
                    raise SelectionError(\
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1378
                        "Invalid %s redundancy specified in pool"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1379
                        " '%s', child '%s'. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1380
                        "Must contain at least 2 devices." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1381
                        (child.redundancy, zpool.name, child.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1382
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1383
            elif child.redundancy == "raidz2" and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1384
                len(vdev_devices) < 3:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1385
                raise SelectionError(\
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1386
                    "Invalid raidz2 redundancy specified in "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1387
                    "pool '%s', child '%s'. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1388
                    "Must contain at least 3 devices." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1389
                    (zpool.name, child.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1390
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1391
            elif child.redundancy == "raidz3" and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1392
                len(vdev_devices) < 4:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1393
                raise SelectionError(\
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1394
                    "Invalid raidz3 redundancy specified in "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1395
                    "zpool '%s', child '%s'. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1396
                    "Must contain at least 4 devices." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1397
                    (zpool.name, child.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1398
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1399
            elif not vdev_devices:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1400
                raise SelectionError(\
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1401
                    "Invalid '%s' redundancy specified in "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1402
                    "zpool '%s', child '%s'. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1403
                    "Must contain at least 1 device." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1404
                    (child.redundancy, zpool.name, child.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1405
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1406
            elif zpool.is_root and len(vdev_devices) > 1:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1407
                if child.redundancy == "none":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1408
                    # Root pool with more than one device cannot
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1409
                    # have redundancy of "none", reset to "mirror"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1410
                    self.logger.debug("Changing root redundancy"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1411
                        " from 'none' to 'mirror'.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1412
                    child.redundancy = "mirror"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1413
                elif child.redundancy in self.RAIDZ_REDUNDANCY:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1414
                    raise SelectionError("Root pool redundancy"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1415
                        " cannot be raidz*. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1416
                        "zpool '%s', child '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1417
                        (zpool.name, child.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1418
                elif child.redundancy in self.INVALID_ROOT_VDEV:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1419
                    raise SelectionError("Root pool cannot"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1420
                        " contain '%s' vdevs. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1421
                        "zpool '%s', child '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1422
                        (child.redundancy, zpool.name, child.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1423
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1424
            elif len(vdev_devices) == 1 and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1425
                child.redundancy == "mirror":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1426
                vdev_key = zpool.name + ":" + child.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1427
                if zpool.is_root:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1428
                    # Root pool with one device cannot
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1429
                    # have redundancy of "mirror", reset to "none"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1430
                    self.logger.debug("Changing root redundancy"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1431
                        " from 'mirror' to 'none'.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1432
                    child.redundancy = "none"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1433
                elif vdev_key in self._vdev_added_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1434
                    # Data pool where we added default child of
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1435
                    # type mirror, reset to "none"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1436
                    self.logger.debug("Changing data redundancy"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1437
                        " from 'mirror' to 'none'.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1438
                    child.redundancy = "none"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1439
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1440
        if zpool.is_root and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1441
            child.redundancy in self.RAIDZ_REDUNDANCY:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1442
            raise SelectionError("Root pool redundancy"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1443
                " cannot be raidz. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1444
                "zpool '%s', child '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1445
                (zpool.name, child.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1446
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1447
        elif zpool.is_root and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1448
            child.redundancy in self.INVALID_ROOT_VDEV:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1449
            raise SelectionError("Root pool cannot"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1450
                " contain '%s' vdevs. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1451
                "zpool '%s', child '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1452
                (child.redundancy, zpool.name, child.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1453
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1454
    def __validate_vdev_devices(self, zpool, vdev, vdev_devices):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1455
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1456
            Given a list of devices being used in this zpool/vdev, validate
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1457
            that these devices are not already being used in another zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1458
            that exists and is not being destroyed or recreated by this
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1459
            install.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1460
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1461
            self._remaining_zpool_map contains a list of devices that cannot
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1462
            be used in an install. This method assumes this has already been
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1463
            populated before calling this routine.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1464
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1465
            Also validate that each device being used is physically greater
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1466
            than 64MB, or zpool create will fail.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1467
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1468
        if vdev.redundancy in self.TOPLEVEL_REDUNDANCY:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1469
            size_64mb = Size("64" + Size.mb_units)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1470
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1471
        for device in vdev_devices:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1472
            tmp_slice = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1473
            tmp_part = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1474
            tmp_disk = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1475
            if isinstance(device, Slice):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1476
                tmp_slice = device
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1477
                if isinstance(device.parent, Partition):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1478
                    tmp_disk = device.parent.parent
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1479
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1480
                    tmp_disk = device.parent
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1481
            elif isinstance(device, Partition):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1482
                tmp_part = device
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1483
                tmp_disk = device.parent
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1484
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1485
                tmp_disk = device
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1486
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1487
            # Construct what device would be in zpool create
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1488
            ctd = ""
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1489
            if tmp_part is not None and tmp_slice is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1490
                ctd = "p" + tmp_part.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1491
            elif tmp_part is None and tmp_slice is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1492
                ctd = "s" + tmp_slice.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1493
            ctd = ":" + tmp_disk.ctd + ctd
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1494
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1495
            matching_devs = [key for key in self._remaining_zpool_map \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1496
                             if key.endswith(ctd)]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1497
            if matching_devs:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1498
                key_parts = matching_devs[0].split(':')
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1499
                raise SelectionError("Device '%s' already in use by zpool "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1500
                                     " '%s'. Cannot be reused in zpool '%s'." %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1501
                                     (key_parts[2], key_parts[0], zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1502
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1503
                # If just using disk, we need to append s0, when the pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1504
                # is created libzfs actually uses device s0 to create the
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1505
                # the pool, zpool status strips this s0 off when displaying
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1506
                # back to the user, but libzfs correctly returns s0.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1507
                # So add s0 to end and check map again
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1508
                if tmp_part is None and tmp_slice is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1509
                    ctd = ctd + "s0"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1510
                    matching_devs = [key for key in self._remaining_zpool_map \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1511
                                                    if key.endswith(ctd)]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1512
                    if matching_devs:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1513
                        key_parts = matching_devs[0].split(':')
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1514
                        raise SelectionError("Device '%s' already in use by "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1515
                            "zpool '%s'. Cannot be reused in zpool '%s'." %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1516
                            (key_parts[2], key_parts[0], zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1517
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1518
            if isinstance(device, Disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1519
                if device.disk_prop is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1520
                    dev_size = device.disk_prop.dev_size
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1521
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1522
                    raise SelectionError("Disk device '%s' in vdev '%s' on "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1523
                        "pool '%s' missing size specification." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1524
                        (key_parts[2], vdev.name, key_parts[0]))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1525
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1526
                dev_size = device.size
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1527
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1528
            if vdev.redundancy in self.TOPLEVEL_REDUNDANCY and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1529
                dev_size < size_64mb:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1530
                raise SelectionError("Device '%s' in toplevel vdev '%s' "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1531
                    " on zpool '%s' is less then minimum zpool device "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1532
                    "size of 64MB." % (key_parts[2], vdev.name, key_parts[0]))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1533
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1534
    def __compile_remaining_existing_devices_map(self, logical):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1535
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1536
            Process list of self._discovered_zpool_map, along with
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1537
            all the zpools being defined in desired.logical, and come
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1538
            up with a unique list of devices that will exist on the system
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1539
            and cannot be specified in logical.desired.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1540
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1541
        remaining_map = copy.copy(self._discovered_zpool_map)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1542
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1543
        for zpool in logical.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1544
            zpool_key = zpool.name + ":"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1545
            if zpool.exists:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1546
                # Desired zpool exists, regardless of action simply
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1547
                # remove all current devices relating to this zpool
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1548
                iter_remaining_map = copy.copy(remaining_map)
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1549
                for zpool_map_key in iter_remaining_map:
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1550
                    if zpool_map_key.startswith(zpool_key):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1551
                        del remaining_map[zpool_map_key]
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1552
                del iter_remaining_map
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1553
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1554
        return remaining_map
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1555
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1556
    def __get_existing_zpool_map(self):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1557
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1558
            For all zpools that have been discovered, get dictionary of
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1559
            devices for each zpool and populate private variable
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1560
            self._discovered_zpool_map.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1561
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1562
        zpool_map = dict()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1563
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1564
        # Cycle through existing zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1565
        for zpool in self._discovered_zpools:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1566
            # Get list of physical devices on this existing pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1567
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1568
            # Get dictionary of disk devices for this zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1569
            # Must check zpool.exists, if get_vdev_mapping is called
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1570
            # with a pool that does not exist, zpool_get_config() cores
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1571
            # and self._discovered_zpools could be populated from tests
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1572
            if zpool.exists:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1573
                vdev_map = vdevs._get_vdev_mapping(zpool.name)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1574
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1575
                vdev_map = dict()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1576
            for vdev_key in vdev_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1577
                for device in vdev_map[vdev_key]:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1578
                    # Get device ctd from end of device path
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1579
                    device_ctd = device.split('/')[-1]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1580
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1581
                    # Create a dummy disk object for __find_disk() to work with
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1582
                    disk = Disk("foo")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1583
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1584
                    # Retrieve the disk only portion of the ctd
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1585
                    match = re.match(DISK_RE, device_ctd, re.I)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1586
                    if match is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1587
                        disk.ctd = match.group()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1588
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1589
                        # Attempt to find a matching discovered disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1590
                        # this should always be successful
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1591
                        discovered_disk = self.__find_disk(disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1592
                        if discovered_disk is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1593
                            devkey = zpool.name + ":" + disk.ctd + ":" + \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1594
                                     device_ctd
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1595
                            zpool_map[devkey] = discovered_disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1596
                        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1597
                            raise SelectionError("Unable to find discovered "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1598
                                "disk '%s', used in zpool '%s'." %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1599
                                (disk.ctd, zpool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1600
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1601
                        # Zpool device is not a disk, must be a file
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1602
                        disk.ctd = device_ctd
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1603
                        devkey = zpool.name + ":" + device + ":" + \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1604
                                 device_ctd
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1605
                        zpool_map[devkey] = discovered_disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1606
        return zpool_map
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1607
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1608
    def __validate_disks(self, desired):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1609
        '''Process Disk components of desired tree ensuring:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1610
           A device is uniquely identifiable as belonging to a zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1611
           either via in_zpool and/or in_vdev being specified. A parent
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1612
           cannot be identifiable if it contains children, the identifiers
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1613
           must reside on the lowest child.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1614
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1615
           - Disk validation :
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1616
               Whole-Disk, has kids - fail
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1617
               Whole-Disk, no kids, not identifiable - fail
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1618
               Whole-Disk, in root pool - fail
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1619
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1620
               Not Whole-Disk, no kids - fail
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1621
               Not Whole-Disk, has kids, is identifiable - fail as kids should
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1622
                   contain the identifying information not the disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1623
               Not whole-disk, has kids, not identifiable - good, process kids
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1624
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1625
               Two disks with same name, fail
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1626
               If root pool disk, ensure label is VTOC not GPT
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1627
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1628
           - Partition validation :
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1629
               - To get to validate a partition, disk parent must be not
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1630
                 whole disk, and parent disk is not identifiable
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1631
               - Action other than create and use_existing are ignored.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1632
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1633
               - for each create/use_existing partition :
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1634
                   - identifiable, has kids - fail should not have slices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1635
                   - identifiable, no kids - good for non root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1636
                    - identifiable, no kids - fail if root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1637
                   - not identifiable, no kids - fail
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1638
                   - not identifiable, has kids - good, process kids(slices)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1639
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1640
               - two partitions with same name on same disk, fail
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1641
               - Only one is_solaris partition exists on a disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1642
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1643
           - Slice validation :
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1644
               - To get to validate a slice on sparc, disk parent must be not
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1645
                 whole disk. and disk parent is not identifiable
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1646
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1647
               - Any action other than create is ignored
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1648
               - For each sparc create slices :
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1649
                   - identifiable - good
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1650
                   - not identifiable - fail
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1651
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1652
               - For X86 slices, to get this far, parent partition must be
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1653
                 not identifiable and actioned create/use-existing
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1654
               - For each i386 create slice:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1655
                   - identifiable - good
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1656
                   - not identifiable - fail
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1657
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1658
               - two slices with same name on same disk, or partition, fail
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1659
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1660
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1661
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1662
        # Get Disk sections
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1663
        disks = desired.get_children(class_type=Disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1664
        self.logger.debug("Validating DESIRED Disks")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1665
        self.logger.debug("Disks(Desired) =\n%s\n" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1666
            (self.__pretty_print_disk(disks)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1667
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1668
        tmp_disk_map = list()       # List of disk ctd's
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1669
        tmp_partition_map = list()  # list of disk:partiton
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1670
        tmp_slice_map = list()  # list of disk:slice or disk:partition:slice
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1671
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1672
        for disk in disks:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1673
            if self.__check_disk_in_root_pool(disk) and disk.label != "VTOC":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1674
                raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1675
                    "Root pool Disk '%s' must contain VTOC label not '%s' ." %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1676
                    (self.__pretty_print_disk(disk), disk.label))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1677
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1678
            # Validate in_zpool specified and in_vdev not, but > 1 vdevs
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1679
            if disk.ctd in tmp_disk_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1680
                raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1681
                    "Disk '%s' specified more than once." %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1682
                    (self.__pretty_print_disk(disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1683
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1684
            # Add disk to temporary list map
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1685
            tmp_disk_map.append(disk.ctd)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1686
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1687
            if disk.whole_disk:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1688
                # Whole disk cannot be in root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1689
                if self.__check_in_root_pool(disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1690
                    raise SelectionError("Disk '%s', Using whole disk "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1691
                        "and located in root pool not valid." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1692
                        (self.__pretty_print_disk(disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1693
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1694
                # Whole disk cannot have children specified.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1695
                if disk.has_children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1696
                    raise SelectionError("Disk '%s', Using whole disk "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1697
                        "and has partition/slice specified is not valid." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1698
                        (self.__pretty_print_disk(disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1699
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1700
                # Disk is not uniquely identifiable
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1701
                if not self.__device_is_identifiable(disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1702
                    raise SelectionError("Disk '%s', Using whole disk "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1703
                        "and not logically uniquely identifiable. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1704
                        "in_zpool '%s', in_vdev '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1705
                        (self.__pretty_print_disk(disk), disk.in_zpool,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1706
                        disk.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1707
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1708
                # Not Whole-Disk, no kids - fail
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1709
                if len(disk.children) == 0:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1710
                    raise SelectionError("Disk '%s' Not using whole disk "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1711
                        "and no partition/slice specified which ss invalid."
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1712
                        % (self.__pretty_print_disk(disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1713
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1714
                # Not Whole-Disk, has kids, is identifiable - fail
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1715
                if disk.has_children and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1716
                    self.__device_is_identifiable(disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1717
                    raise SelectionError("Disk '%s', Not using whole disk, "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1718
                        "has children and is logically uniquely identifiable"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1719
                        " which is invalid.  in_zpool '%s', in_vdev '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1720
                        (self.__pretty_print_disk(disk), disk.in_zpool,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1721
                        disk.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1722
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1723
                # Not whole-disk, has kids, not identifiable - good
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1724
                if disk.has_children and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1725
                    not self.__device_is_identifiable(disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1726
                    # Process kids, identify should be set there
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1727
                    solaris_partition_found = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1728
                    for disk_kid in disk.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1729
                        # Partition, check only exists once
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1730
                        if isinstance(disk_kid, Partition):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1731
                            partkey = disk.ctd + ":" + disk_kid.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1732
                            if partkey in tmp_partition_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1733
                                raise SelectionError("Partition '%s' "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1734
                                    "specified twice on disk '%s'." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1735
                                    (disk_kid.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1736
                                    self.__pretty_print_disk(disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1737
                            tmp_partition_map.append(partkey)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1738
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1739
                            # Ensure only one solaris partition resides on disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1740
                            if disk_kid.is_solaris and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1741
                               disk_kid.action != "delete":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1742
                                if solaris_partition_found:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1743
                                    raise SelectionError("Disk '%s' cannot "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1744
                                        "contain multiple Solaris partitions."
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1745
                                        % (self.__pretty_print_disk(disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1746
                                solaris_partition_found = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1747
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1748
                            # Slice check only exists once on this disk/part.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1749
                            for slc in disk_kid.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1750
                                slicekey = disk.ctd + ":" + disk_kid.name + \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1751
                                    ":" + slc.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1752
                                if slicekey in tmp_slice_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1753
                                    raise SelectionError("Slice '%s' "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1754
                                        "specified twice within partiton '%s'"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1755
                                        " on disk '%s'." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1756
                                        (slc.name, disk_kid.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1757
                                        self.__pretty_print_disk(disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1758
                                tmp_slice_map.append(slicekey)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1759
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1760
                                # Is identifiable, make sure not set for swap
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1761
                                if self.__device_is_identifiable(slc) and \
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1762
                                    slc.is_swap:
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1763
                                    raise SelectionError("Slice '%s' in disk "
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1764
                                        "'%s' cannot be assigned to swap and "
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1765
                                        "be part of a zpool. in_zpool '%s', "
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1766
                                        "in_vdev '%s'" % (slc.name,
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1767
                                        self.__pretty_print_disk(disk),
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1768
                                        slc.in_zpool, slc.in_vdev))
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1769
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1770
                        # Slice check only exists once on this disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1771
                        elif isinstance(disk_kid, Slice):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1772
                            slicekey = disk.ctd + ":" + disk_kid.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1773
                            if slicekey in tmp_slice_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1774
                                raise SelectionError("Slice '%s' "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1775
                                    "specified twice on disk '%s'." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1776
                                    (disk_kid.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1777
                                    self.__pretty_print_disk(disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1778
                            tmp_slice_map.append(slicekey)
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1779
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1780
                            # Is identifiable, make sure not set for swap
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1781
                            if self.__device_is_identifiable(disk_kid) and \
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1782
                                disk_kid.is_swap:
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1783
                                raise SelectionError("Slice '%s' in disk "
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1784
                                    "'%s' cannot be assigned to swap and "
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1785
                                    "be part of a zpool. in_zpool '%s', "
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1786
                                    "in_vdev '%s'" % (disk_kid.name,
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1787
                                    self.__pretty_print_disk(disk),
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1788
                                    disk_kid.in_zpool, disk_kid.in_vdev))
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  1789
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1790
                        # Not partition/slice throw error
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1791
                        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1792
                            raise SelectionError("Invalid child element on "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1793
                                "disk '%s' : '%s'." %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1794
                                (self.__pretty_print_disk(disk), disk_kid))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1795
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1796
                        # Partition, create or use_existing action
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1797
                        if isinstance(disk_kid, Partition) and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1798
                           disk_kid.action in \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1799
                           ["create", "use_existing_solaris2"]:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1800
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1801
                            # identifiable, has kids
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1802
                            if self.__device_is_identifiable(disk_kid) and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1803
                                disk_kid.has_children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1804
                                raise SelectionError("Partition '%s' on disk "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1805
                                    "'%s' is logically uniquely "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1806
                                    "identifiable and has slice children "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1807
                                    "which is invalid. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1808
                                    "in_zpool '%s', in_vdev '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1809
                                    (disk_kid.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1810
                                    self.__pretty_print_disk(disk),
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1811
                                    disk_kid.in_zpool, disk_kid.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1812
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1813
                            # identifiable, no kids, in root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1814
                            if self.__device_is_identifiable(disk_kid) and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1815
                                len(disk_kid.children) == 0 and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1816
                                 self.__check_in_root_pool(disk_kid):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1817
                                raise SelectionError("Partition '%s' on disk "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1818
                                    "'%s' is logically uniquely "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1819
                                    "identifiable with no slice children "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1820
                                    "but is on root pool which is invalid. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1821
                                    "in_zpool '%s', in_vdev '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1822
                                    (disk_kid.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1823
                                    self.__pretty_print_disk(disk),
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1824
                                    disk_kid.in_zpool, disk_kid.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1825
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1826
                            # not identifiable, no kids - fail
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1827
                            if not self.__device_is_identifiable(disk_kid) \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1828
                               and len(disk_kid.children) == 0 \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1829
                               and disk_kid.is_solaris:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1830
                                raise SelectionError("Partition '%s' on disk "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1831
                                    "'%s' is not logically uniquely "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1832
                                    "identifiable and has no slice children "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1833
                                    "whish is invalid. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1834
                                    "in_zpool '%s', in_vdev '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1835
                                    (disk_kid.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1836
                                    self.__pretty_print_disk(disk),
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1837
                                    disk_kid.in_zpool, disk_kid.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1838
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1839
                            # has kids, at least 1 should be identifiable
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1840
                            if not self.__device_is_identifiable(disk_kid) \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1841
                               and disk_kid.has_children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1842
                                found_identifiable_slice = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1843
                                for slc in disk_kid.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1844
                                    if isinstance(slc, Slice) and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1845
                                        slc.action == "create":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1846
                                        # X86 Slice not identifiable
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1847
                                        if self.__device_is_identifiable(slc):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1848
                                            found_identifiable_slice = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1849
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1850
                                    if not isinstance(slc, Slice):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1851
                                        raise SelectionError("Invalid child "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1852
                                          "element on partition '%s' : "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1853
                                          "'%s'." % (disk_kid.name, str(slc)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1854
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1855
                                if not found_identifiable_slice:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1856
                                    raise SelectionError("Slice '%s'"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1857
                                        " on partition '%s' is not "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1858
                                        "logically uniquely "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1859
                                        "identifiable. in_zpool '%s'"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1860
                                        ", in_vdev '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1861
                                        (slc.name, disk_kid.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1862
                                        slc.in_zpool, slc.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1863
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1864
                        # Slice, create action
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1865
                        elif isinstance(disk_kid, Slice) and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1866
                            disk_kid.action == "create":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1867
                            # Sparc Slice not identifiable
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1868
                            if not self.__device_is_identifiable(disk_kid):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1869
                                raise SelectionError("Slice '%s' on disk "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1870
                                    "'%s' is not logically uniquely "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1871
                                    "identifiable. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1872
                                    "in_zpool '%s', in_vdev '%s'" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1873
                                    (disk_kid.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1874
                                    self.__pretty_print_disk(disk),
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1875
                                    disk_kid.in_zpool, disk_kid.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1876
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1877
    def __device_is_identifiable(self, device):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1878
        '''A device can be uniquely identified by using one or both of
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1879
           it's in_zpool and in_vdev attributes.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1880
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1881
           Input :
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1882
               device - A disk, partition or slice device Object
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1883
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1884
           Output :
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1885
               None : if not uniquely identifiable in logical section
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1886
               zpool/vdev tuple : Unique logical location
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1887
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1888
        unique_zpool = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1889
        unique_vdev = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1890
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1891
        # Both in_zpool and in_vdev are specified
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1892
        if device.in_zpool is not None and device.in_vdev is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1893
            vdev_key = device.in_zpool + ":" + device.in_vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1894
            if vdev_key not in self._vdev_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1895
                self.logger.debug("Device '%s' identification failed : "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1896
                    "Combination does not exist. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1897
                    "in_zpool '%s', in_vdev '%s'." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1898
                    (device.name, device.in_zpool, device.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1899
                return None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1900
            unique_zpool = self._zpool_map[device.in_zpool]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1901
            unique_vdev = self._vdev_map[vdev_key]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1902
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1903
        # in_zpool specified, in_vdev not specified
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1904
        elif device.in_zpool is not None and device.in_vdev is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1905
            if device.in_zpool not in self._zpool_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1906
                self.logger.debug("Device '%s' identification failed. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1907
                    "Pool does not exist. in_zpool '%s', in_vdev '%s'." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1908
                    (device.name, device.in_zpool, device.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1909
                return None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1910
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1911
            unique_zpool = self._zpool_map[device.in_zpool]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1912
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1913
            pool_vdevs = self.__get_vdevs_in_zpool(device.in_zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1914
            if len(pool_vdevs) > 1:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1915
                self.logger.debug("Device '%s' identification failed. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1916
                    "More than one vdev in zpool. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1917
                    "in_zpool '%s', in_vdev '%s'." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1918
                    (device.name, device.in_zpool, device.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1919
                return None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1920
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1921
            elif len(pool_vdevs) == 1:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1922
                # Only one vdev in this zpool so therefore device is
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1923
                # uniquely identifiable, set in_vdev on this device
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1924
                # for completeness.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1925
                device.in_vdev = pool_vdevs[0].name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1926
                unique_vdev = pool_vdevs[0]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1927
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1928
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1929
                # Pool has no vdevs, this should not be the case at
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1930
                # this juncture, throw exception.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1931
                raise SelectionError("Zpool '%s' does not contain any "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1932
                    "Vdev's." % (device.in_zpool))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1933
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1934
        # in_zpool not specified, in_vdev specified
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1935
        elif device.in_zpool is None and device.in_vdev is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1936
            # The only way a device can be uniquely identified in this
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1937
            # Scenario is if the vdev name specified exists uniquely
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1938
            # when compared across all pools
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1939
            for vdev_key in self._vdev_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1940
                if self._vdev_map[vdev_key].name == device.in_vdev:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1941
                    if not unique_vdev:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1942
                        zpool_name = vdev_key.split(":")[0]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1943
                        unique_zpool = self._zpool_map[zpool_name]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1944
                        unique_vdev = self._vdev_map[vdev_key]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1945
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1946
                        # 2nd Vdev with this name, so not unique
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1947
                        self.logger.debug(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1948
                            "Device '%s' identification failed. Vdev not "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1949
                            "unique. in_zpool '%s', in_vdev '%s'." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1950
                            (device.name, device.in_zpool, device.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1951
                        return None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1952
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1953
            # Vdev not found at all
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1954
            if not unique_vdev:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1955
                self.logger.debug("Device '%s' identification failed. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1956
                    "Vdev not found. in_zpool '%s', in_vdev '%s'." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1957
                    (device.name, device.in_zpool, device.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1958
                return None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1959
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1960
                # We've found one unique vdev, set the device in_zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1961
                # for completeness.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1962
                device.in_zpool = unique_zpool.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1963
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1964
        # Neither are set so not identifiable
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1965
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1966
            return None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1967
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1968
        return (unique_zpool, unique_vdev)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1969
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1970
    def __get_vdevs_in_zpool(self, zpoolname):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1971
        '''Given a zpool name, retrieve the list of vdevs in this
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1972
           pool from the vdev_map.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1973
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1974
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1975
        pool_vdevs = list()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1976
        start_vdev_key = zpoolname + ":"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1977
        for vdev_key in self._vdev_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1978
            if vdev_key.startswith(start_vdev_key):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1979
                pool_vdevs.append(self._vdev_map[vdev_key])
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1980
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1981
        return pool_vdevs
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1982
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1983
    @staticmethod
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1984
    def __get_zpool_redundancies(zpool):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1985
        '''Traverse all vdev children in a zpool returning a unique list
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1986
           of redundancy types defined in this zpool.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1987
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1988
        vdev_redundancies = dict()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1989
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1990
        for vdev in zpool.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1991
            if isinstance(vdev, Vdev):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1992
                vdev_redundancies[vdev.redundancy] = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1993
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1994
        return vdev_redundancies.keys()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1995
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1996
    def __get_vdev_devices(self, zpool_name, vdev_name, device_map):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1997
        '''Get list of devices with this vdev name.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1998
           If not set then recursively check for in_vdev setting on children.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  1999
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2000
           Cater for device_map being either a list or a dictionary.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2001
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2002
           If in_vdev set on both parent and children, throw exception.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2003
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2004
           Device can be identified as part of a vdev either via in_vdev or
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2005
           in_zpool or both. As long as it's uniquely identifiable.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2006
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2007
           Remember a vdev name is only unique within's it's zpool, different
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2008
           zpool's can contain vdevs with the same name.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2009
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2010
        vdev_devices = list()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2011
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2012
        if isinstance(device_map, dict):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2013
            tmp_device_map = device_map.values()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2014
        elif self.__is_iterable(device_map):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2015
            tmp_device_map = device_map
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2016
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2017
            # Return now, as nothing to traverse
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2018
            return vdev_devices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2019
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2020
        for device in tmp_device_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2021
            identity_tuple = self.__device_is_identifiable(device)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2022
            if identity_tuple:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2023
                if (isinstance(device, Disk) or
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2024
                    isinstance(device, Partition)) and device.has_children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2025
                    # If disk or partition and has children, and is
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2026
                    # identifiable this is an error, as one/all of the
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2027
                    # children should contain identifying information
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2028
                    device_str = self.__get_device_type_string(device)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2029
                    raise SelectionError("%s '%s' is uniquely identifiable "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2030
                        "and it has children. Invalid, as children should "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2031
                        "contain identifying information. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2032
                        "in_zpool '%s', in_vdev '%s'." % (device_str,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2033
                        device.name, device.in_zpool, device.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2034
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2035
                # Append this device if the found device matches both
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2036
                # zpool and vdev names
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2037
                if identity_tuple[0].name == zpool_name and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2038
                    identity_tuple[1].name == vdev_name:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2039
                    vdev_devices.append(device)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2040
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2041
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2042
                if device.in_zpool is not None or device.in_vdev is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2043
                    # Throw exception, as cannot identify uniquely yet
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2044
                    # some logical identification information present
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2045
                    device_str = self.__get_device_type_string(device)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2046
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2047
                    if isinstance(device, Slice):
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2048
                        # Only raise exception if not a swap slice and
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2049
                        # slice is being not being deleted.
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2050
                        if device.action != "delete" and not device.is_swap:
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2051
                            raise SelectionError("Logical information present "
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2052
                                "on %s '%s', but is not enough to uniquely "
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2053
                                "identify it. in_zpool '%s', in_vdev '%s'." %
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2054
                                (device_str, device.name, device.in_zpool,
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2055
                                 device.in_vdev))
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2056
                    else:
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2057
                        raise SelectionError("Logical information present on "
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2058
                            "%s '%s', but is not enough to uniquely identify "
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2059
                            "it. in_zpool '%s', in_vdev '%s'." % (device_str,
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2060
                            device.name, device.in_zpool, device.in_vdev))
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2061
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2062
                if (isinstance(device, Disk) or
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2063
                    isinstance(device, Partition)) and device.has_children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2064
                    # Device has children which should identify location
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2065
                    tmp_devices = self.__get_vdev_devices(zpool_name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2066
                        vdev_name, device.children)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2067
                    for dev in tmp_devices:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2068
                        vdev_devices.append(dev)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2069
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2070
        return vdev_devices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2071
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2072
    @staticmethod
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2073
    def __get_device_type_string(device):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2074
        '''Get a descriptive string for the device'''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2075
        if isinstance(device, Disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2076
            device_str = "Disk"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2077
        elif isinstance(device, Partition):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2078
            device_str = "Partition"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2079
        elif isinstance(device, Slice):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2080
            device_str = "Slice"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2081
        return device_str
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2082
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2083
    def __check_disk_in_root_pool(self, disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2084
        '''Tests if a specified disk is in the root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2085
           if the disk does not have in_zpool, in_vdev specified
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2086
           then start processing children. If no chilcren throw
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2087
           error.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2088
           Check all children, and if any one of them are in the root
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2089
           pool return true, otherwise return false.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2090
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2091
        if self.__check_in_root_pool(disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2092
            return True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2093
        elif disk.has_children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2094
            for disk_kid in disk.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2095
                if self.__check_in_root_pool(disk_kid):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2096
                    return True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2097
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2098
                if isinstance(disk_kid, Partition) and disk_kid.children > 0:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2099
                    for slc in disk_kid.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2100
                        if self.__check_in_root_pool(slc):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2101
                            return True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2102
        return False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2103
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2104
    def __check_in_root_pool(self, device):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2105
        '''Tests if a device (disk/partition/slice) is in the root pool.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2106
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2107
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2108
        if device.in_zpool == self._root_pool.name:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2109
            return True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2110
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2111
        rpool_vdev_id = "%s:%s" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2112
            (self._root_pool.name, device.in_vdev)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2113
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2114
        if device.in_zpool is None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2115
           rpool_vdev_id in self._vdev_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2116
            # Assumption is we've validated the uniqueness of vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2117
            # specification in the object earlier in __check_valid_zpool_vdev()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2118
            return True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2119
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2120
        return False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2121
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2122
    def __handle_partition(self, partition, new_disk, discovered_disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2123
        '''Handle the partition as specified in the manifest.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2124
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2125
           Will return a new Partition object to be inserted in the DESIRED
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2126
           tree such that Target Instantiation is able to perform.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2127
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2128
        # Ensure this is an i386 machine if partitions are specified.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2129
        if platform.processor() != "i386":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2130
            raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2131
                "Cannot specify partitions on this machine architecture")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2132
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2133
        existing_partition = discovered_disk.get_first_child(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2134
            partition.name, class_type=Partition)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2135
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2136
        if partition.action in ["preserve", "delete", "use_existing_solaris2"]:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2137
            if existing_partition is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2138
                # If it's delete action, just do nothing since it's not really
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2139
                # an issue to delete something that's not there.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2140
                if partition.action == "delete":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2141
                    self.logger.warn(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2142
                        "Attempt to delete non-existant partition"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2143
                        " %s on disk %s ignored" % (partition.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2144
                        self.__pretty_print_disk(discovered_disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2145
                    # Return now since there's nothing to do.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2146
                    return
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2147
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2148
                    raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2149
                        "Cannot %s partition %s that doesn't exist on disk %s"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2150
                        % (partition.action, partition.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2151
                           self.__pretty_print_disk(discovered_disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2152
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2153
                # Do nothing, just copy over.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2154
                new_partition = copy.copy(existing_partition)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2155
                new_partition.action = partition.action
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2156
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2157
                # Initialize logical information on deleted partitions
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2158
                if new_partition.action == "delete":
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2159
                    new_partition.in_zpool = None
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2160
                    new_partition.in_vdev = None
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2161
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2162
        elif partition.action == "create":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2163
            if existing_partition is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2164
                self.logger.warn(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2165
                    "Creating partition %s on disk %s will "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2166
                    "destroy existing data." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2167
                    (partition.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2168
                     self.__pretty_print_disk(discovered_disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2169
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2170
            new_partition = copy.copy(partition)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2171
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2172
            raise SelectionError("Unexpected action '%s' on partition %s"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2173
                % (partition.name, partition.action))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2174
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2175
        if partition.action in ["use_existing_solaris2", "create"]:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2176
            # Mark partition as ACTIVE, if it's Solaris
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2177
            if new_partition.is_solaris:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2178
                # Need to set attribute, since Partition.change_bootid
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2179
                # manipulates the parent object, which there isn't yet...
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2180
                # Only applies to primary partitions
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2181
                if partition.is_primary:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2182
                    new_partition.bootid = Partition.ACTIVE
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2183
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2184
            if new_partition.size.sectors == 0 or \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2185
               new_partition.start_sector is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2186
                # According to DTD, if size is not specified, should use
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2187
                # parents size information.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2188
                # If start_sector is None, try to allocate size into a gap.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2189
                if partition.action == "create":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2190
                    if partition.is_logical:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2191
                        gaps = new_disk.get_logical_partition_gaps()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2192
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2193
                        gaps = new_disk.get_gaps()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2194
                    largest_gap = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2195
                    for gap in gaps:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2196
                        if new_partition.start_sector is None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2197
                           new_partition.size.sectors != 0 and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2198
                           gap.size >= new_partition.size:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2199
                            # Specified a size with only start_sector missing.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2200
                            new_partition.start_sector = gap.start_sector
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2201
                            break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2202
                        if largest_gap is None or \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2203
                           gap.size.sectors > largest_gap.size.sectors:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2204
                            largest_gap = gap
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2205
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2206
                        # Will be skipped if searching for a gap to insert a
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2207
                        # partition of a given size succeeds.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2208
                        if largest_gap is None or \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2209
                           largest_gap.size < \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2210
                           self.controller.minimum_target_size or \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2211
                           largest_gap.size < new_partition.size:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2212
                            raise SelectionError("Failed to find gap on disk"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2213
                                " of sufficient size to put partition"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2214
                                " %s in to" % (new_partition.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2215
                        new_partition.start_sector = largest_gap.start_sector
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2216
                        new_partition.size = largest_gap.size
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2217
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2218
                    raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2219
                        "Cannot find size of existing partition '%s' on "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2220
                        "discovered_disk '%s'"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2221
                        % (new_partition.name, discovered_disk.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2222
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2223
            # Need to do more than just copy
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2224
            if discovered_disk.disk_prop is not None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2225
               new_partition.size > discovered_disk.disk_prop.dev_size:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2226
                raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2227
                    "Partition %s has a size larger than the disk %s" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2228
                    (new_partition.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2229
                    self.__pretty_print_disk(discovered_disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2230
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2231
            # Insert partition now, since shadowlist validation will require
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2232
            # that the disk be known for partitions or children.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2233
            new_disk.insert_children(new_partition)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2234
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2235
            # Only process solaris partitions
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2236
            if partition.is_solaris:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2237
                if not partition.has_children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2238
                    # If it's a root pool, or we have a partition that's not in
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2239
                    # a pool we assume it should be in the root pool.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2240
                    if self.__check_in_root_pool(partition) \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2241
                       or (partition.in_zpool is None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2242
                           partition.in_vdev is None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2243
                           self._root_pool is not None):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2244
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2245
                        # Need to add a slice since a root pool cannot exist on
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2246
                        # with partition vdevs, must be slice vdevs
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2247
                        start = 1  # Will be rounded up to cylinder by TI
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2248
                        slice_size = new_partition.size.sectors
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2249
                        new_slice = new_partition.add_slice("0", start,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2250
                            slice_size, Size.sector_units, force=True)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2251
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2252
                        if partition.in_zpool is None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2253
                           partition.in_vdev is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2254
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2255
                            # Assume it should be in the root pool since
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2256
                            # nothing specific provided in the manifest
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2257
                            new_slice.in_zpool = self._root_pool.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2258
                            if self._root_vdev is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2259
                                new_slice.in_vdev = self._root_vdev.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2260
                        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2261
                            # Copy in_zpool/vdev to slice, and remove from
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2262
                            # partition.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2263
                            new_slice.in_zpool = new_partition.in_zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2264
                            new_slice.in_vdev = new_partition.in_vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2265
                            new_partition.in_zpool = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2266
                            new_partition.in_vdev = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2267
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2268
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2269
                    self.__handle_slices(partition.children,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2270
                                         new_partition, existing_partition)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2271
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2272
            # Insert partition now, since shadowlist validation will require
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2273
            # that the disk be known for partitions or children.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2274
            new_disk.insert_children(new_partition)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2275
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2276
        return new_partition
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2277
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2278
    def __handle_slice(self, orig_slice, parent_object, existing_parent_obj):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2279
        '''Handle the slice as specified in the manifest.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2280
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2281
           Will return a new Slice object to be inserted in the DESIRED
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2282
           tree such that Target Instantiation is able to perform.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2283
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2284
        if orig_slice.name == "2":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2285
            # Skip s2 definition, shouldn't be there, and Target Instantiation
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2286
            # will create
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2287
            self.logger.warning("Skipping orig_slice 2 definition")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2288
            return None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2289
1152
67a7b566bd10 7048532 NoneType object exception occurred referecing existing_parent_object
Matt Keenan <matt.keenan@oracle.com>
parents: 1151
diff changeset
  2290
        if existing_parent_obj is not None:
67a7b566bd10 7048532 NoneType object exception occurred referecing existing_parent_object
Matt Keenan <matt.keenan@oracle.com>
parents: 1151
diff changeset
  2291
            existing_slice = existing_parent_obj.get_first_child(
67a7b566bd10 7048532 NoneType object exception occurred referecing existing_parent_object
Matt Keenan <matt.keenan@oracle.com>
parents: 1151
diff changeset
  2292
                                    orig_slice.name, class_type=Slice)
67a7b566bd10 7048532 NoneType object exception occurred referecing existing_parent_object
Matt Keenan <matt.keenan@oracle.com>
parents: 1151
diff changeset
  2293
        else:
67a7b566bd10 7048532 NoneType object exception occurred referecing existing_parent_object
Matt Keenan <matt.keenan@oracle.com>
parents: 1151
diff changeset
  2294
            existing_slice = None
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2295
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2296
        if orig_slice.action in ["preserve", "delete"]:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2297
            if existing_slice is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2298
                # If it's delete action, just do nothing since it's not really
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2299
                # an issue to delete something that's not there.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2300
                if orig_slice.action == "delete":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2301
                    if isinstance(parent_object, Disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2302
                        self.logger.warn(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2303
                            "Attempt to delete non-existant slice"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2304
                            " %s on disk %s ignored" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2305
                            (orig_slice.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2306
                            self.__pretty_print_disk(parent_object)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2307
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2308
                        self.logger.warn(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2309
                            "Attempt to delete non-existant slice"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2310
                            " %s on partition '%s', disk %s ignored" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2311
                            (orig_slice.name, parent_object.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2312
                            self.__pretty_print_disk(parent_object.parent)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2313
                    # Return now since there's nothing to do.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2314
                    return None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2315
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2316
                    if isinstance(parent_object, Disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2317
                        raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2318
                            "Cannot %s slice %s that doesn't exist on disk %s"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2319
                            % (orig_slice.action, orig_slice.name,
1227
4ecf733307ad 7058653 undefined variable disk_kd and discovered_disk in checkpoints/target_selection.py
Drew Fisher <drew.fisher@oracle.com>
parents: 1197
diff changeset
  2320
                            self.__pretty_print_disk(parent_object)))
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2321
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2322
                        raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2323
                            "Cannot %s slice %s that doesn't exist on "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2324
                            "partition %s, disk %s" % (orig_slice.action,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2325
                            orig_slice.name, parent_object.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2326
                            self.__pretty_print_disk(parent_object.parent)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2327
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2328
                # Do nothing, just copy over.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2329
                new_slice = copy.copy(existing_slice)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2330
                new_slice.action = orig_slice.action
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2331
                # For slices being deleted initialize out logical info. This
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2332
                # Will ensure later on at least one slice gets assigned to the
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2333
                # root pool.
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2334
                if new_slice.action == "delete":
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2335
                    new_slice.in_zpool = None
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2336
                    new_slice.in_vdev = None
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2337
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2338
        elif orig_slice.action == "create":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2339
            if existing_slice is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2340
                if isinstance(parent_object, Disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2341
                    self.logger.warn(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2342
                        "Creating slice %s on disk %s will "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2343
                        "destroy existing data." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2344
                        (orig_slice.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2345
                        self.__pretty_print_disk(parent_object)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2346
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2347
                    self.logger.warn(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2348
                        "Creating slice %s on partition %s, disk %s will "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2349
                        "destroy existing data." % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2350
                        (orig_slice.name, parent_object.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2351
                        self.__pretty_print_disk(parent_object.parent)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2352
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2353
            new_slice = copy.copy(orig_slice)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2354
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2355
            raise SelectionError("Unexpected action '%s' on slice %s"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2356
                % (orig_slice.name, orig_slice.action))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2357
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2358
        if new_slice.action == "create":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2359
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2360
            if isinstance(parent_object, Disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2361
                if parent_object.disk_prop is not None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2362
                   new_slice.size > parent_object.disk_prop.dev_size:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2363
                    raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2364
                        "Slice %s has a size larger than the disk %s" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2365
                        (new_slice.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2366
                         self.__pretty_print_disk(parent_object)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2367
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2368
                # It's a partition
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2369
                if parent_object.size is not None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2370
                   new_slice.size > parent_object.size:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2371
                    raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2372
                        "Slice %s has a size larger than the containing "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2373
                        "partition %s" % (new_slice.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2374
                        parent_object.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2375
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2376
        if new_slice.action == "create" and (new_slice.size.sectors == 0 or
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2377
           new_slice.start_sector is None):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2378
            # According to DTD, if size is not specified, should use
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2379
            # parents size information.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2380
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2381
            if new_slice.size.sectors == 0 or new_slice.start_sector is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2382
                # According to DTD, if size is not specified, should use
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2383
                # parents size information.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2384
                # If start_sector is None, try to allocate size into a gap.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2385
                if orig_slice.action == "create":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2386
                    gaps = parent_object.get_gaps()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2387
                    largest_gap = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2388
                    for gap in gaps:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2389
                        if new_slice.start_sector is None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2390
                           new_slice.size.sectors > 0 and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2391
                           gap.size >= new_slice.size:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2392
                            # Specified a size with only start_sector missing.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2393
                            new_slice.start_sector = gap.start_sector
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2394
                            break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2395
                        if largest_gap is None or \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2396
                           gap.size.sectors > largest_gap.size.sectors:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2397
                            largest_gap = gap
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2398
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2399
                        # Will be skipped if searching for a gap to insert a
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2400
                        # slice of a given size succeeds.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2401
                        if largest_gap is None or \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2402
                           largest_gap.size < \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2403
                           self.controller.minimum_target_size:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2404
                            raise SelectionError("Failed to find gap on disk"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2405
                                " of sufficient size to put slice"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2406
                                " %s in to" % (new_slice.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2407
                        new_slice.start_sector = largest_gap.start_sector
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2408
                        new_slice.size = largest_gap.size
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2409
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2410
        return new_slice
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2411
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2412
    def __handle_slices(self, slices, new_parent_obj, existing_parent_obj):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2413
        '''Process list of slices and attach to new_parent_obj as children.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2414
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2415
           Returns a list of new slices.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2416
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2417
        # Specifics in manifest take precedence, so
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2418
        # if they exist already, ignore them.
1152
67a7b566bd10 7048532 NoneType object exception occurred referecing existing_parent_object
Matt Keenan <matt.keenan@oracle.com>
parents: 1151
diff changeset
  2419
        if existing_parent_obj is not None and \
1157
1d35c8956cab 7049686 should not give error on sparc :'Disk' object has no attribute 'action'
Matt Keenan <matt.keenan@oracle.com>
parents: 1152
diff changeset
  2420
            ((isinstance(new_parent_obj, Disk)) or \
1d35c8956cab 7049686 should not give error on sparc :'Disk' object has no attribute 'action'
Matt Keenan <matt.keenan@oracle.com>
parents: 1152
diff changeset
  2421
             (isinstance(new_parent_obj, Partition) and \
1d35c8956cab 7049686 should not give error on sparc :'Disk' object has no attribute 'action'
Matt Keenan <matt.keenan@oracle.com>
parents: 1152
diff changeset
  2422
              new_parent_obj.action == "use_new_solaris2")):
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2423
            tmp_slices = list()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2424
            for exist_slice in existing_parent_obj.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2425
                skip_slice = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2426
                for mf_slice in slices:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2427
                    if mf_slice.name == exist_slice.name:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2428
                        # Already inserted, skip
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2429
                        break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2430
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2431
                    slice_copy = copy.copy(exist_slice)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2432
                    # Remove in_zpool/in_vdev values
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2433
                    # because these should exist in
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2434
                    # manifest but don't and will cause
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2435
                    # validations to fail.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2436
                    slice_copy.in_zpool = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2437
                    slice_copy.in_vdev = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2438
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2439
                    tmp_slices.append(slice_copy)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2440
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2441
            # Temporarily skip validation since
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2442
            # may cause validation failures
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2443
            new_parent_obj.validate_children = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2444
            new_parent_obj.insert_children(tmp_slices)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2445
            new_parent_obj.validate_children = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2446
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2447
        # Need to handle all preserved slices first inserting them into
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2448
        # new parent, this ensures get_gaps works for newly created slices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2449
        for orig_slice in [s for s in slices if s.action == "preserve"]:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2450
            new_slice = self.__handle_slice(orig_slice, new_parent_obj,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2451
                                            existing_parent_obj)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2452
            if new_slice is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2453
                new_parent_obj.insert_children(new_slice)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2454
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2455
        # While processing slices, remember whether we found
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2456
        # any slices with an in_zpool or in_vdev, and if not
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2457
        # then we will use the first large enough slice.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2458
        first_large_slice = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2459
        found_zpool_vdev_slice = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2460
        for orig_slice in [s for s in slices if s.action != "preserve"]:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2461
            new_slice = self.__handle_slice(orig_slice, new_parent_obj,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2462
                                            existing_parent_obj)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2463
            if new_slice is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2464
                new_parent_obj.insert_children(new_slice)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2465
                if new_slice.in_zpool is None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2466
                   new_slice.in_vdev is None:
1266
6b6ba78c5310 7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Matt Keenan <matt.keenan@oracle.com>
parents: 1252
diff changeset
  2467
                    if not new_slice.is_swap and \
6b6ba78c5310 7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Matt Keenan <matt.keenan@oracle.com>
parents: 1252
diff changeset
  2468
                       first_large_slice is None and \
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2469
                       new_slice.action == "create" and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2470
                       new_slice.size >= self.controller.minimum_target_size:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2471
                        # Remember the first sufficiently large slice thats
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2472
                        # got a create or use_existing action
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2473
                        first_large_slice = new_slice
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2474
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2475
                    found_zpool_vdev_slice = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2476
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2477
        # Check to see if we didn't find any specific references to vdevs
1266
6b6ba78c5310 7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Matt Keenan <matt.keenan@oracle.com>
parents: 1252
diff changeset
  2478
        # Sets in_zpool/in_vdev on at least one slice, do not set on a slice
6b6ba78c5310 7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Matt Keenan <matt.keenan@oracle.com>
parents: 1252
diff changeset
  2479
        # that has in_use set to swap
6b6ba78c5310 7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Matt Keenan <matt.keenan@oracle.com>
parents: 1252
diff changeset
  2480
        if self._is_generated_root_pool and not found_zpool_vdev_slice:
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2481
            if first_large_slice is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2482
                # Set in_zpool/in_vdev on slice, and remove from
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2483
                # disk parent object (just in case)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2484
                first_large_slice.in_zpool = self._root_pool.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2485
                if self._root_vdev is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2486
                    first_large_slice.in_vdev = self._root_vdev.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2487
                new_parent_obj.in_zpool = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2488
                new_parent_obj.in_vdev = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2489
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2490
                raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2491
                    "No slice large enough to install to was found on disk")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2492
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2493
    def __handle_disk(self, disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2494
        '''Handle a disk object.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2495
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2496
           Find the disk in the discovered tree, take a copy, and then if
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2497
           necessary add/remove partitions based on version passed that came
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2498
           from the manifest.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2499
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2500
           Returns: the new disk to be inserted into the DESIRED Tree
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2501
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2502
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2503
        self.logger.debug("Processing disk : %s" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2504
            self.__pretty_print_disk(disk))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2505
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2506
        ret_disk = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2507
        errsvc.clear_error_list()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2508
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2509
        discovered_disk = self.__find_disk(disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2510
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2511
        if discovered_disk is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2512
            raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2513
               "Unable to locate the disk '%s' on the system." %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2514
                self.__pretty_print_disk(disk))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2515
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2516
        if discovered_disk.ctd in self._disk_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2517
            # Seems that the disk is specified more than once in the manifest!
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2518
            raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2519
                "Disk '%s' matches already used disk '%s'." %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2520
                (self.__pretty_print_disk(disk), discovered_disk.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2521
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2522
        # Check that in_zpool and in_vdev values from manifest are valid
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2523
        self.__check_valid_zpool_vdev(disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2524
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2525
        if disk.whole_disk:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2526
            # Fail if we somehow get whole_disk = True and partitions/slices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2527
            if disk.has_children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2528
                raise SelectionError("Invalid request to use whole disk when"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2529
                    " specifying partitions or slices on disk %s" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2530
                    (self.__pretty_print_disk(disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2531
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2532
            # Only copy the disk, not it's children.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2533
            disk_copy = copy.copy(discovered_disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2534
            self._disk_map[disk_copy.ctd] = disk_copy
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2535
            self.logger.debug("Using Whole Disk")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2536
            if disk.in_zpool is None and disk.in_vdev is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2537
                self.logger.debug("Zpool/Vdev not specified")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2538
                if self._is_generated_root_pool:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2539
                    self.logger.debug("Assigning to temporary root pool")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2540
                    # Assign to temporary root pool if one exists
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2541
                    disk.in_zpool = self._root_pool.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2542
                    disk.in_vdev = self._root_vdev.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2543
                elif self._root_pool is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2544
                    # Assign to real root pool if one exists
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2545
                    disk.in_zpool = self._root_pool.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2546
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2547
            if not self.__check_in_root_pool(disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2548
                self.logger.debug("Disk Not in root pool")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2549
                # We can leave it for ZFS to partition itself optimally
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2550
                disk_copy.whole_disk = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2551
                # Add vdev/zpool values to disk_copy
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2552
                disk_copy.in_zpool = disk.in_zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2553
                disk_copy.in_vdev = disk.in_vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2554
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2555
                disk_copy.whole_disk = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2556
                # When bug : 7037884 we can then add this back and support
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2557
                # The Changing of a GPT disk to VTOC automatically
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2558
                # disk_copy.label = "VTOC"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2559
                self.logger.debug("Disk in root pool")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2560
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2561
                # Layout disk using partitions since root pools can't use
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2562
                # EFI/GPT partitioned disks to boot from yet.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2563
                self.logger.debug("Whole Disk, applying default layout")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2564
                root_vdev = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2565
                if self._root_vdev is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2566
                    root_vdev = self._root_vdev.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2567
                elif disk.in_vdev is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2568
                    # If the disk specified a vdev, copy it.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2569
                    root_vdev = disk.in_vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2570
                self.controller.apply_default_layout(disk_copy, False, True,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2571
                    in_zpool=self._root_pool.name, in_vdev=root_vdev)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2572
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2573
            ret_disk = disk_copy
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2574
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2575
            # Copy disk, and and try to merge partitions and slices from
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2576
            # manifest and existing layouts.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2577
            disk_copy = copy.copy(discovered_disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2578
            self._disk_map[disk_copy.ctd] = disk_copy
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2579
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2580
            # Get partitions and slices from manifest version of Disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2581
            partitions = disk.get_children(class_type=Partition)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2582
            slices = disk.get_children(class_type=Slice)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2583
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2584
            # Do some basic sanity checks
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2585
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2586
            # If not partitions, but have slices, fail now, if i386
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2587
            if platform.processor() == "i386" and not partitions and slices:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2588
                raise SelectionError("Invalid specification of slices "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2589
                        "outside of partition on the %s platform"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2590
                        % (platform.processor()))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2591
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2592
            # If partitions, fail now, if not i386
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2593
            if platform.processor() != "i386" and partitions:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2594
                raise SelectionError("Invalid specification of partitions "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2595
                        "on this %s platform" % (platform.processor()))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2596
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2597
            if (platform.processor() == "i386" and not partitions) or \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2598
               (platform.processor() != "i386" and not slices):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2599
                raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2600
                    "If whole_disk is False, you need to provide"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2601
                    " information for partitions or slices")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2602
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2603
            if partitions:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2604
                for partition in partitions:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2605
                    # If there is no name specified only seek if no name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2606
                    # provided.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2607
                    if (partition.name is None or
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2608
                       len(partition.name) != 0) and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2609
                       partition.action == "use_existing_solaris2":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2610
                        # Pre-empt this by replacing it with a discovered
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2611
                        # Solaris2 partition if one exists
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2612
                        solaris_partition = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2613
                        for existing_partition in discovered_disk.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2614
                            if existing_partition.is_solaris:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2615
                                solaris_partition = existing_partition
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2616
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2617
                        if solaris_partition is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2618
                            raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2619
                                "Cannot find a pre-existig Solaris "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2620
                                "partition on disk %s"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2621
                                % (self.__pretty_print_disk(discovered_disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2622
                        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2623
                            tmp_partition = copy.copy(solaris_partition)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2624
                            # Ensure partition action maintained.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2625
                            tmp_partition.action = partition.action
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2626
                            if not partition.has_children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2627
                                if solaris_partition.has_children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2628
                                    # Because no slices are being specified in
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2629
                                    # the manifest we have to assume we are to
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2630
                                    # create a slice for root.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2631
                                    # TODO: Should this be looking for a gap?
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2632
                                    self.logger.warn(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2633
                                        "Existing partition's slices are not"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2634
                                        "being preserved")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2635
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2636
                                # Temporarily skip validation since
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2637
                                # tmp_partition not yet in disk and will cause
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2638
                                # failures.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2639
                                tmp_partition.validate_children = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2640
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2641
                                # Add a slice 0 for the root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2642
                                # Size calculated automatically later.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2643
                                tmp_slice = tmp_partition.add_slice("0", 1, 0,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2644
                                    Size.sector_units, force=True)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2645
                                tmp_partition.validate_children = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2646
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2647
                                # Assign to root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2648
                                tmp_slice.in_zpool = self._root_pool.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2649
                                if self._root_vdev is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2650
                                    tmp_slice.in_vdev = self._root_vdev.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2651
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2652
                            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2653
                                # Specifics in manifest take precedence, so
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2654
                                # copy first.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2655
                                tmp_slices = list()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2656
                                for mf_slice in partition.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2657
                                    tmp_slices.append(copy.copy(mf_slice))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2658
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2659
                                for exist_slice in solaris_partition.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2660
                                    skip_slice = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2661
                                    for mf_slice in partition.children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2662
                                        if mf_slice.name == exist_slice.name:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2663
                                            # Already inserted, skip
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2664
                                            break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2665
                                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2666
                                        slice_copy = copy.copy(exist_slice)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2667
                                        # Remove in_zpool/in_vdev values
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2668
                                        # because these should exist in
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2669
                                        # manifest but don't and will cause
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2670
                                        # validations to fail.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2671
                                        slice_copy.in_zpool = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2672
                                        slice_copy.in_vdev = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2673
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2674
                                        tmp_slices.append(slice_copy)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2675
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2676
                                # Temporarily skip validation since
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2677
                                # tmp_partition not yet in disk and will cause
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2678
                                # failures.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2679
                                tmp_partition.validate_children = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2680
                                tmp_partition.insert_children(tmp_slices)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2681
                                tmp_partition.validate_children = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2682
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2683
                            # Do susbstitution
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2684
                            partitions.remove(partition)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2685
                            partitions.insert(int(tmp_partition.name),
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2686
                                tmp_partition)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2687
                            # Break now, since partitions list has changed.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2688
                            break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2689
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2690
                # Copy over any existing partitions, if they are not in the
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2691
                # manifest, since the manifest takes priority.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2692
                # Sort byname to ensure we handle primaries first.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2693
                skip_existing_logicals = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2694
                for existing_partition in \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2695
                    sorted(discovered_disk.children, key=attrgetter("name")):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2696
                    for mf_partition in partitions:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2697
                        if mf_partition.name == existing_partition.name:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2698
                            if existing_partition.is_extended and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2699
                               mf_partition.action in ["create", "delete"]:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2700
                                # If we're replacing an extended partition then
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2701
                                # we need to ensure any existing logicals are
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2702
                                # not copied over, effectively deleting them.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2703
                                skip_existing_logicals = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2704
                            break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2705
                    else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2706
                        # Copy everything else, unless it's a logical and we're
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2707
                        # supposed to be skipping them.
1152
67a7b566bd10 7048532 NoneType object exception occurred referecing existing_parent_object
Matt Keenan <matt.keenan@oracle.com>
parents: 1151
diff changeset
  2708
                        if not (existing_partition.is_logical and
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2709
                                skip_existing_logicals):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2710
                            partitions.append(copy.copy(existing_partition))
1152
67a7b566bd10 7048532 NoneType object exception occurred referecing existing_parent_object
Matt Keenan <matt.keenan@oracle.com>
parents: 1151
diff changeset
  2711
                            # Also insert to new disk so gaps calculations work
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2712
                            disk_copy.insert_children(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2713
                                copy.copy(existing_partition))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2714
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2715
                extended_partitions = [p for p in partitions if p.is_extended]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2716
                if len(extended_partitions) > 1:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2717
                    raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2718
                        "It is only possible to have at most 1 extended"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2719
                        " partition defined")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2720
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2721
                for partition in partitions:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2722
                    if disk_copy.get_first_child(partition.name) is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2723
                        # Skip this, we've already processed it above.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2724
                        continue
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2725
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2726
                    # Ensure partition is set to be in temporary root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2727
                    # __handle_partition() relies on this.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2728
                    if partition.is_solaris:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2729
                        if self._is_generated_root_pool \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2730
                           and not partition.has_children \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2731
                           and partition.action == "create" \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2732
                           and partition.in_zpool is None \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2733
                           and partition.in_vdev is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2734
                            # Assign to temporary root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2735
                            partition.in_zpool = self._root_pool.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2736
                            partition.in_vdev = self._root_vdev.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2737
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2738
                    # Process partitions, and contained slices
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2739
                    new_partition = self.__handle_partition(partition,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2740
                        disk_copy, discovered_disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2741
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2742
                    # Insertion to disk done in __handle_partition()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2743
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2744
            else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2745
                # Can assume we're on SPARC machine now.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2746
                if len(slices) == 1 and slices[0].name == "2":
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2747
                    # There is only one slice we need to check to see if
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2748
                    # it's slice "2". If is it we need to add a slice "0"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2749
                    # and set in_vdev and in_zpool.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2750
                    # TODO: This will need to be updated for GPT when ready
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2751
                    # Add a slice
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2752
                    start = 1  # Will be rounded up to cylinder by TI
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2753
                    slice_size = \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2754
                      disk_copy.disk_copy_prop.dev_size.sectors - start
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2755
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2756
                    new_slice = disk_copy.add_slice("0", start,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2757
                        slice_size, Size.sector_units, force=True)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2758
                    if slices[0].in_vdev is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2759
                        new_slice.in_vdev = slices[0].in_vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2760
                    if self._root_pool is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2761
                        new_slice.in_zpool = self._root_pool.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2762
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2763
                    self.__handle_slices(slices, disk_copy, discovered_disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2764
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2765
            ret_disk = disk_copy
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2766
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2767
        self.logger.debug("Finished processing disk : %s" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2768
            self.__pretty_print_disk(disk))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2769
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2770
        # Check error service for errors
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2771
        errors = errsvc.get_all_errors()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2772
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2773
        # Found errors and they cannot be ignored
1227
4ecf733307ad 7058653 undefined variable disk_kd and discovered_disk in checkpoints/target_selection.py
Drew Fisher <drew.fisher@oracle.com>
parents: 1197
diff changeset
  2774
        if errors:
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2775
            # Print desired contents to log
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2776
            existing_desired = \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2777
                self.doc.persistent.get_first_child(Target.DESIRED)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2778
            if existing_desired:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2779
                self.logger.debug("Desired =\n%s\n" % (str(existing_desired)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2780
            self.logger.debug("Disk =\n%s\n" % (str(ret_disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2781
            errstr = "Following errors occurred processing disks :\n%s" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2782
                (str(errors[0]))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2783
            raise SelectionError(errstr)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2784
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2785
        return ret_disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2786
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2787
    def __create_temp_logical_tree(self, existing_logicals):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2788
        '''Create a set of logicals that we will use should there be no other
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2789
           logicals defined in the manifest.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2790
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2791
        if existing_logicals:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2792
            # Add Zpool to existing logical, pick first one
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2793
            logical = existing_logicals[0]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2794
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2795
            logical = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2796
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2797
        logical = self.controller.apply_default_logical(logical,
1252
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  2798
            self.be_mountpoint, redundancy="mirror",
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  2799
            unique_zpool_name=not self.dry_run)
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2800
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2801
        # There may be more than one pool in this logical, so need to
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2802
        # iterate over all pools breaking when root pool found.
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2803
        zpools = logical.get_children(class_type=Zpool)
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2804
        for zpool in zpools:
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2805
            if zpool.is_root:
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2806
                break
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2807
        else:
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2808
            # This should never happen as the controller method
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2809
            # apply_default_logical, will have created a root pool.
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2810
            raise SelectionError("Failed to find controller created root pool")
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2811
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2812
        vdev = zpool.get_first_child(class_type=Vdev)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2813
        be = zpool.get_first_child(class_type=BE)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2814
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2815
        # Set instance variables
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2816
        self._is_generated_root_pool = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2817
        self._root_pool = zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2818
        self._root_vdev = vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2819
        self._be = be
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2820
        # Add pool to maps so final validations will work
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2821
        self._zpool_map[zpool.name] = zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2822
        vdev_key = zpool.name + ":" + vdev.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2823
        self._vdev_map[vdev_key] = vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2824
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2825
        return logical
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2826
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2827
    def __cleanup_temp_logical(self, logical, existing_logicals):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2828
        if not self._is_generated_root_pool:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2829
            return
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2830
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2831
        if logical not in existing_logicals:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2832
            logical.delete()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2833
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2834
            logical.delete_children(self._root_pool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2835
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2836
        # Remove pool from maps since we're not using it.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2837
        del self._zpool_map[self._root_pool.name]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2838
        vdev_key = self._root_pool.name + ":" + self._root_vdev.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2839
        del self._vdev_map[vdev_key]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2840
        # Reset instance variables
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2841
        self._is_generated_root_pool = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2842
        self._root_pool = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2843
        self._root_vdev = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2844
        self._be = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2845
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2846
    def __handle_target(self, target):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2847
        '''Process target section in manifest'''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2848
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2849
        # Reset all local map information
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2850
        self.__reset_maps()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2851
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2852
        new_desired_target = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2853
        logical_inserted = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2854
        skip_disk_processing = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2855
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2856
        # Get Logical sections
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2857
        logicals = target.get_children(class_type=Logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2858
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2859
        # It's possible that there are no logicial sections.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2860
        if logicals:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2861
            for logical in logicals:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2862
                new_logical = self.__handle_logical(logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2863
                if new_logical is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2864
                    if new_desired_target is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2865
                        new_desired_target = self.__get_new_desired_target()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2866
                    new_desired_target.insert_children(new_logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2867
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2868
        if new_desired_target is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2869
            all_whole_disk = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2870
            disks = target.get_children(class_type=Disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2871
            for disk in disks:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2872
                if disk.whole_disk and disk.in_zpool is None \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2873
                   and disk.in_vdev is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2874
                    if all_whole_disk is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2875
                        all_whole_disk = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2876
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2877
                    all_whole_disk = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2878
                    break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2879
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2880
            if all_whole_disk is not None and all_whole_disk:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2881
                # Can use TargetController now
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2882
                # Call initialize again to ensure logicals created, since
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2883
                # previously called to not create logicals.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2884
                self.controller.initialize(no_initial_disk=True,
1252
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  2885
                                           unique_zpool_name=not self.dry_run)
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2886
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2887
                # Disk specified in target may not contain a name, find
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2888
                # A matching disk in the discovered tree
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2889
                discovered_disks = list()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2890
                for disk in disks:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2891
                    dd = self.__find_disk(disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2892
                    if dd is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2893
                        discovered_disks.append(dd)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2894
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2895
                if not discovered_disks:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2896
                    raise SelectionError("Failed to match target disk(s) "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2897
                        "discovered disks.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2898
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2899
                selected_disks = self.controller.select_disk(discovered_disks,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2900
                    use_whole_disk=True)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2901
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2902
                # When bug : 7037884 we can then add this back and support
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2903
                # The Changing of a GPT disk to VTOC automatically
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2904
                #for disk in selected_disks:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2905
                #    # Ensure we're using VTOC labelling until GPT integrated
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2906
                #    disk.label = "VTOC"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2907
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2908
                # Target Controller will insert default root pool need to
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2909
                # Set this for validation of name later on
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2910
                self._is_generated_root_pool = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2911
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2912
                # Need to update the logical map, as new one just created
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2913
                new_desired_target = self.__get_new_desired_target()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2914
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2915
                # Get New Logical sections
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2916
                logicals = new_desired_target.get_children(class_type=Logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2917
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2918
                if logicals is not None and logicals:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2919
                    for logical in logicals:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2920
                        # A logical may have been specified just for
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2921
                        # the purposes of noswap and nodump, ensure
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2922
                        # This information is passed onto handle_logical
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2923
                        if self._nozpools:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2924
                            logical.noswap = self._noswap
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2925
                            logical.nodump = self._nodump
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2926
                        # No need to insert into new_desired, already there
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2927
                        self.__handle_logical(logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2928
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2929
                # Update disk map
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2930
                self.__add_disks_to_map(selected_disks)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2931
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2932
                skip_disk_processing = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2933
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2934
        if not skip_disk_processing:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2935
            if self._root_pool is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2936
                # There is no zpool, so we will add one temporarily
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2937
                # This will allow us to fill-in the in_zpool/in_vdev for disks
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2938
                # that don't have any explicitly set already.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2939
                tmp_logical = self.__create_temp_logical_tree(logicals)
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2940
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2941
                if new_desired_target is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2942
                    new_desired_target = self.__get_new_desired_target()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2943
                if tmp_logical not in logicals or self._nozpools:
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2944
                    # Insert new logical into desired tree
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2945
                    new_desired_target.insert_children(tmp_logical)
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2946
                else:
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2947
                    # Could be re-using existing logical section.
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2948
                    # Replace in desired tree with this one.
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2949
                    existing_logical = new_desired_target.get_first_child(
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2950
                                                    class_type=Logical)
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2951
                    if existing_logical:
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  2952
                        new_desired_target.delete_children(existing_logical)
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2953
                    new_desired_target.insert_children(tmp_logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2954
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2955
            # It's also possible to have no disks, if so install to first
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2956
            # available disk that is large enough to install to.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2957
            # Should be cycling through manifest disks or discovered disks
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2958
            # looking at __handle_disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2959
            disks = target.get_children(class_type=Disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2960
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2961
            # If no Disks, but have a logical section, then we need to
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2962
            # auto-select, and add disk.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2963
            if not disks and self._root_pool is not None and \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2964
                self._root_pool.action not in self.PRESERVED:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2965
                disk = self.controller.select_initial_disk()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2966
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2967
                if disk is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2968
                    self.logger.info("Selected Disk(s) : %s" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2969
                        (self.__pretty_print_disk(disk)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2970
                    # When bug : 7037884 we can then add this back and support
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2971
                    # The Changing of a GPT disk to VTOC automatically
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2972
                    ## Ensure were using a VTOC label
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2973
                    #disk.label = "VTOC"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2974
                    pool_vdevs = self.__get_vdevs_in_zpool(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2975
                        self._root_pool.name)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2976
                    root_vdev_name = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2977
                    if self._root_vdev is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2978
                        root_vdev_name = self._root_vdev.name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2979
                    elif len(pool_vdevs) > 1:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2980
                        self.logger.debug(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2981
                            "Automatic disk selection failed. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2982
                            "More than one possible vdev in zpool. "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2983
                            "in_zpool '%s'." % (self._root_pool.name))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2984
                    elif len(pool_vdevs) == 1:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2985
                        root_vdev_name = pool_vdevs[0].name
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2986
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2987
                    # Ensure using whole-disk in a way suitable for root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2988
                    self.controller.apply_default_layout(disk, False, True,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2989
                        in_zpool=self._root_pool.name, in_vdev=root_vdev_name)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2990
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2991
                    if new_desired_target is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2992
                        new_desired_target = self.__get_new_desired_target()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2993
                    new_desired_target.insert_children(disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2994
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2995
                    self._disk_map[disk.ctd] = disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2996
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2997
            for disk in disks:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2998
                if self._is_generated_root_pool:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  2999
                    # Fail if manifest has disk references to temporary pool we
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3000
                    # just created.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3001
                    if disk.in_zpool == self._root_pool.name or \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3002
                       disk.in_vdev == self._root_vdev.name:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3003
                        raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3004
                            "Invalid selection of non-existent pool"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3005
                            " or vdev for disk")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3006
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3007
                new_disk = self.__handle_disk(disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3008
                if new_disk is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3009
                    if new_desired_target is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3010
                        new_desired_target = self.__get_new_desired_target()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3011
                    new_desired_target.insert_children(new_disk)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3012
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3013
            # If disks were added to temporary root pool, make it permanent
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3014
            if self._is_generated_root_pool:
1177
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  3015
                # At this point any slices that were specified but don't
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  3016
                # contain identifiable info, will cause no devices to be
f0e6e450a3e7 7050875 Cannot create a swap slice in CUD/AI
Matt Keenan <matt.keenan@oracle.com>
parents: 1157
diff changeset
  3017
                # returned.
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3018
                vdev_devices = self.__get_vdev_devices(self._root_pool.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3019
                                                       self._root_vdev.name,
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3020
                                                       self._disk_map)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3021
                if vdev_devices is not None and vdev_devices:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3022
                    # Keep root pool since we used it.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3023
                    self._is_generated_root_pool = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3024
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3025
                    self.__cleanup_temp_logical(logical, logicals)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3026
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3027
        if new_desired_target is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3028
            self.logger.debug("Validating desired =\n%s\n" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3029
                (str(new_desired_target)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3030
            self.__validate_swap_and_dump(new_desired_target)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3031
            self.__validate_logical(new_desired_target)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3032
            self.__validate_disks(new_desired_target)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3033
            # Do final validation before passing to Target Instantiation
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3034
            if not new_desired_target.final_validation():
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3035
                errors = errsvc.get_all_errors()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3036
                if errors:
1266
6b6ba78c5310 7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Matt Keenan <matt.keenan@oracle.com>
parents: 1252
diff changeset
  3037
                    errstr = "Following errors occurred during final " \
6b6ba78c5310 7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Matt Keenan <matt.keenan@oracle.com>
parents: 1252
diff changeset
  3038
                        "validation :\n%s" % (str(errors[0]))
6b6ba78c5310 7063283 Unable to create UFS swap via AI Install. Tries to associate swap with zpool
Matt Keenan <matt.keenan@oracle.com>
parents: 1252
diff changeset
  3039
                    raise SelectionError(errstr)
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3040
                else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3041
                    raise SelectionError("Final Validation Failed. See "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3042
                        "install_log for more details.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3043
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3044
        return new_desired_target
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3045
1252
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  3046
    def select_targets(self, from_manifest, discovered, dry_run=False):
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3047
        '''The starting point for selecting targets.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3048
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3049
           Arguments:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3050
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3051
           - from_manifest: A referents to a list of target objects that were
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3052
                            imported from the manifest.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3053
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3054
           - discovered:    A reference to the root node of the discovered
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3055
                            targets.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3056
1252
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  3057
           - dry_run:       Target Selection dry_run indicator. Mainly used
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  3058
                            by unit tests.
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  3059
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3060
           If there are no targets in the manifest, we will defer to Target
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3061
           Controller to do the selection of the disk to install to.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3062
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3063
           If there are targets, we will process them by traversing the tree
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3064
           using __handle_XXXX methods for each object type.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3065
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3066
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3067
        if discovered is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3068
            raise SelectionError("No installation targets found.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3069
1252
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  3070
        self.dry_run = dry_run
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  3071
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3072
        # Store list of discovered disks
1197
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
  3073
        self._discovered_disks = discovered.get_children(class_type=Disk)
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3074
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3075
        # Store list of discovered zpools
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3076
        self._discovered_zpools = discovered.get_descendants(class_type=Zpool)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3077
        if len(self._discovered_zpools) > 0:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3078
            # Store map of devices on discovered zpools
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3079
            self._discovered_zpool_map = self.__get_existing_zpool_map()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3080
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3081
        if len(self._discovered_disks) == 0:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3082
            raise SelectionError("No installation target disks found.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3083
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3084
        if from_manifest:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3085
            self.logger.debug("from_manifest =\n%s\n" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3086
                              (str(from_manifest[0])))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3087
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3088
            self.logger.debug("from_manifest = NONE\n")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3089
        self.logger.debug("discovered =\n%s\n" % (str(discovered)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3090
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3091
        # Check if all Targets have children
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3092
        targets_have_children = False
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3093
        if from_manifest:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3094
            for target in from_manifest:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3095
                if target.has_children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3096
                    targets_have_children = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3097
                    break
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3098
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3099
        selected_disks = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3100
        new_target = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3101
        if from_manifest is None or not targets_have_children:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3102
            # Default to TargetController's automatic mechanism
1252
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  3103
            initial_disks = self.controller.initialize(
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  3104
                unique_zpool_name=not self.dry_run)
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3105
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3106
            # Occasionally initialize fails to select a disk because
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3107
            # it cannot find a slice large enough to install to, however
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3108
            # we are using whole disk, so just find first one large enough
1197
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
  3109
            if not initial_disks:
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
  3110
                initial_disks = self.controller.select_initial_disk()
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3111
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3112
            self.logger.info("Selected Disk(s) : %s" % \
1197
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
  3113
                (self.__pretty_print_disk(initial_disks)))
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3114
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3115
            # Ensure whole-disk is selected for each disk.
1197
41dc6c86a4c3 7020411 support in TD/TI for interfaces that provide CRO information in libdevinfo
Drew Fisher <drew.fisher@oracle.com>
parents: 1177
diff changeset
  3116
            selected_disks = self.controller.select_disk(initial_disks,
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3117
                use_whole_disk=True)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3118
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3119
            # When bug : 7037884 we can then add this back and support
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3120
            # The Changing of a GPT disk to VTOC automatically
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3121
            #for disk in desired_disks:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3122
            #    # Ensure we're using VTOC labelling until GPT integrated
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3123
            #    disk.label = "VTOC"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3124
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3125
            # Target Controller will insert default root pool need to
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3126
            # Set this for validation of name later on
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3127
            self._is_generated_root_pool = True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3128
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3129
            # Target Controller is not setting the mountpoint for the default
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3130
            # BE so need to set it here just in case.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3131
            # Also getting the desired tree and doing some validation here
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3132
            # seems like a good idea too.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3133
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3134
            # As desired tree has been configured, makes sense to fill out
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3135
            # The internal maps, and call various validate functions, doing
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3136
            # this ensure both target controller and target selection are
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3137
            # populating the desired tree in the same manner.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3138
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3139
            existing_desired = \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3140
                self.doc.persistent.get_first_child(Target.DESIRED)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3141
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3142
            if existing_desired:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3143
                # Traverse Logicals until we get the BE
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3144
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3145
                self.logger.debug("No targets specified in Manifest, "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3146
                    "Target Controller has selected default target.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3147
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3148
                self.logger.debug("Target Controller Pre-Desired : \n%s\n" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3149
                    (str(existing_desired)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3150
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3151
                self.logger.debug("Target Selection ensuring BE "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3152
                    "mountpoint set to '%s'." % (self.be_mountpoint))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3153
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3154
                # Get New Logical sections
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3155
                logicals = existing_desired.get_children(class_type=Logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3156
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3157
                # Update logical maps and set be mountpoint
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3158
                if logicals is not None and logicals:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3159
                    be = None
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3160
                    for logical in logicals:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3161
                        # A logical may have been specified just for
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3162
                        # the purposes of noswap and nodump, ensure
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3163
                        # This information is passed onto handle_logical
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3164
                        if self._nozpools:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3165
                            logical.noswap = self._noswap
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3166
                            logical.nodump = self._nodump
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3167
                        # No need to insert into new_desired, already there
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3168
                        self.__handle_logical(logical)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3169
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3170
                        # Get BE object from root pool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3171
                        for zpool in \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3172
                                [z for z in logical.children if z.is_root]:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3173
                            be = zpool.get_first_child(class_type=BE)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3174
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3175
                if be is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3176
                    self.logger.debug("Setting BE mountpoint to '%s'" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3177
                        (self.be_mountpoint))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3178
                    be.mountpoint = self.be_mountpoint
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3179
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3180
                # Update disk map
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3181
                for disk in selected_disks:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3182
                    if disk.ctd in self._disk_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3183
                        # Seems that the disk is specified more than once in
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3184
                        # the manifest!
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3185
                        raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3186
                            "Disk '%s' matches already used disk '%s'." %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3187
                            (self.__pretty_print_disk(disk), disk.ctd))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3188
                    self._disk_map[disk.ctd] = disk
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3189
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3190
                # As TC has configured the logical section we also need
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3191
                # to ensure swap and dump zvols exist if required.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3192
                self.logger.debug("Target Selection ensuring swap/dump "
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3193
                    "configured if required.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3194
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3195
                self.__validate_swap_and_dump(existing_desired)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3196
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3197
                # Validate logical/disk portions of desired tree
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3198
                self.__validate_logical(existing_desired)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3199
                self.__validate_disks(existing_desired)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3200
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3201
                self.logger.debug("Target Controller Post-Desired : \n%s\n" %
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3202
                    (str(existing_desired)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3203
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3204
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3205
            # Can't rely on TargetController much here, so perform own
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3206
            # selections and interpret values from the manifest.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3207
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3208
            if from_manifest:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3209
                # The AI DTD only allows for one <target> element.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3210
                new_target = self.__handle_target(from_manifest[0])
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3211
                if new_target is not None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3212
                    # Got a new DESIRED tree, so add to DOC
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3213
                    existing_desired = \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3214
                        self.doc.persistent.get_first_child(Target.DESIRED)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3215
                    if existing_desired:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3216
                        self.doc.persistent.delete_children(existing_desired)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3217
                    self.doc.persistent.insert_children(new_target)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3218
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3219
        if not selected_disks and not new_target:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3220
            raise SelectionError("Unable to find suitable target for install.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3221
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3222
        self.logger.debug("Selected disk(s): %s" % (repr(selected_disks)))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3223
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3224
    def __check_valid_zpool_vdev(self, disk):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3225
        '''Check that disk refers to known zpool and/or vdev
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3226
           Will raise an SelectionError exception if anything is wrong.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3227
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3228
        if disk.in_zpool is not None and len(disk.in_zpool) > 0:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3229
            if disk.in_zpool not in self._zpool_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3230
                raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3231
                    "Disk %s specifies non-existent in_zpool: %s"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3232
                    % (self.__pretty_print_disk(disk), disk.in_zpool))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3233
            # Limit vdev match to specific zpool
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3234
            zpool_list_to_match = [disk.in_zpool]
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3235
        else:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3236
            # Need to compare vdev to all known zpools.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3237
            zpool_list_to_match = self._zpool_map.keys()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3238
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3239
        # If only specify vdev, then try see if it exists
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3240
        # as a vdev in one of the known zpools
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3241
        if disk.in_vdev is not None and len(disk.in_vdev) > 0:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3242
            vdev_matches = 0
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3243
            for zpool in zpool_list_to_match:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3244
                vdev_id = "%s:%s" % \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3245
                    (zpool, disk.in_vdev)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3246
                if vdev_id in self._vdev_map:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3247
                    vdev_matches += 1
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3248
            if vdev_matches == 0:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3249
                raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3250
                    "Disk %s specifies non-existent in_vdev: %s"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3251
                    % (self.__pretty_print_disk(disk), disk.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3252
            elif vdev_matches > 1:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3253
                raise SelectionError(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3254
                    "Disk %s specifies non-unique in_vdev: %s"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3255
                    % (self.__pretty_print_disk(disk), disk.in_vdev))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3256
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3257
        # TODO : If disk.in_zpool and disk.in_vdev are none, should we
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3258
        # be checking the children here
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3259
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3260
        # If we got this far we're ok, otherwise an exception will be raised.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3261
        return True
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3262
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3263
    def __get_new_desired_target(self):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3264
        '''Create a new DESIRED tree using Target Controller
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3265
           initialize which performs the following :
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3266
           - Sets minimum_target_size
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3267
           - deletes any existing desired tree
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3268
           - Calls Target(Target.DESIRED)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3269
           - Inserts Desired into DOC
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3270
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3271
        new_desired_target = \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3272
            self.doc.persistent.get_first_child(Target.DESIRED)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3273
        if new_desired_target is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3274
            self.controller.initialize(no_initial_logical=True,
1252
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  3275
                                       unique_zpool_name=not self.dry_run)
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3276
            new_desired_target = \
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3277
                self.doc.persistent.get_first_child(Target.DESIRED)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3278
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3279
        if new_desired_target is None:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3280
            raise SelectionError("Failed to create new DESIRED tree.")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3281
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3282
        return new_desired_target
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3283
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3284
    def parse_doc(self):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3285
        '''Method for locating objects in the  data object cache (DOC) for
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3286
           use by the checkpoint.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3287
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3288
           Will return a tuple of Data Object references for the Targets:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3289
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3290
           (from_manifest, discovered)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3291
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3292
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3293
        from_manifest = self.doc.find_path(
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3294
            "//[@solaris_install.auto_install.ai_instance.AIInstance?2]"
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3295
            "//[@solaris_install.target.Target?2]")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3296
        discovered = self.doc.persistent.get_first_child(Target.DISCOVERED)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3297
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3298
        return (from_manifest, discovered)
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3299
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3300
    # Implement AbstractCheckpoint methods.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3301
    def get_progress_estimate(self):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3302
        '''Returns an estimate of the time this checkpoint will take
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3303
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3304
        return 3
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3305
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3306
    def execute(self, dry_run=False):
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3307
        '''Primary execution method used by the Checkpoint parent class
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3308
           to select the targets during an install.
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3309
        '''
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3310
        self.logger.info("=== Executing Target Selection Checkpoint ==")
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3311
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3312
        try:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3313
            (from_manifest, discovered) = self.parse_doc()
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3314
1252
131154a3dcbe 7061408 TargetSelection should not fail if zpool directory exists when running unit tests
Matt Keenan <matt.keenan@oracle.com>
parents: 1247
diff changeset
  3315
            self.select_targets(from_manifest, discovered, dry_run)
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3316
        except Exception:
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3317
            self.logger.debug("%s" % (traceback.format_exc()))
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents:
diff changeset
  3318
            raise