usr/src/lib/install_engine/__init__.py
author Ginnie Wray<virginia.wray@oracle.com>
Tue, 19 Jun 2012 12:18:37 -0600
changeset 1717 10cb4d15a248
parent 1418 8e9701e2c0f3
permissions -rw-r--r--
7066254 Problem with install/logging 7170155 DC leaves log files in /var/tmp/install
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
947
29603af1b942 6999599 Missing shebang lines in python modules leads to incorrect dependency generation
Keith Mitchell <keith.mitchell@oracle.com>
parents: 922
diff changeset
     1
#!/usr/bin/python
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
     2
#
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
     3
# CDDL HEADER START
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
     4
#
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
     8
#
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    12
# and limitations under the License.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    13
#
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    19
#
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    20
# CDDL HEADER END
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    21
#
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    22
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    23
#
1717
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
    24
# Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    25
#
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    26
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    27
'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    28
Class representing the Installation Execution Engine
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    29
'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    30
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    31
import decimal
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
    32
import glob
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    33
import imp
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    34
import inspect
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    35
import logging
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    36
import os
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    37
import shutil
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    38
import string
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    39
import tempfile
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    40
import threading
913
83925e67521c 6996397 InstallEngine missing import of warnings module
Karen Tung <karen.tung@oracle.com>
parents: 909
diff changeset
    41
import warnings
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    42
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    43
import osol_install.errsvc as errsvc
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    44
import osol_install.liberrsvc as liberrsvc
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    45
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    46
from logging import CRITICAL, ERROR, WARNING, INFO, DEBUG, NOTSET
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    47
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    48
from osol_install.install_utils import get_argspec
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    49
from solaris_install.data_object import DataObject
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    50
from solaris_install.data_object.cache import DataObjectCache
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    51
from solaris_install.engine.checkpoint_data import CheckpointData
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    52
from solaris_install.logger import InstallLogger, LogInitError, \
1717
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
    53
     INSTALL_LOGGER_NAME
1070
ef77609251f5 7021591 provide an implementation of TI/TD based on CUD
Drew Fisher <drew.fisher@oracle.com>
parents: 948
diff changeset
    54
from solaris_install.target.logical import Filesystem
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    55
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    56
LOGGER = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    57
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    58
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    59
class EngineError(StandardError):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    60
    '''Base class for engine specific errors'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    61
    pass
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    62
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    63
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    64
class RollbackError(EngineError):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    65
    '''Error during an attempt to rollback'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    66
    _MSG = "Cannot rollback to '%s' checkpoint: %s"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    67
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    68
    def __init__(self, cp_name, reason):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    69
        msg = RollbackError._MSG % (cp_name, reason)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    70
        self.checkpoint = cp_name
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    71
        EngineError.__init__(self, msg)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    72
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    73
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    74
class SingletonError(EngineError):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    75
    '''Occurs when one attempts to instantiate a second singleton'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    76
    pass
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    77
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    78
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    79
class UsageError(EngineError):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    80
    '''General usage error for an engine call'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    81
    pass
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    82
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    83
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    84
class NoCacheError(RollbackError, IOError):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    85
    '''Error during rollback - can't find the DOC'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    86
    def __init__(self, cp_name, cache_path):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    87
        self.cache_path = cache_path
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    88
        RollbackError.__init__(self, cp_name,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    89
                               "Cache does not exist at path: %s" % cache_path)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    90
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    91
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    92
class ChkptRegistrationError(EngineError):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    93
    '''Error occur while trying to register a checkpoint'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    94
    pass
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    95
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    96
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    97
class UnknownChkptError(UsageError):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    98
    '''Error occurs when attempting to access a checkpoint that doesn't
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
    99
    exist'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   100
    pass
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   101
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   102
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   103
class NoDatasetError(UsageError):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   104
    '''ZFS dataset is not specified.'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   105
    pass
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   106
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   107
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   108
class FileNotFoundError(UsageError):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   109
    ''' The specified zfs dataset is not found, or
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   110
        no DataObjectCache snapshot exist in the provided ZFS dataset.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   111
    '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   112
    pass
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   113
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   114
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   115
class EngineData(DataObject):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   116
    '''Root node below DataObjectCache for storing all install
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   117
       engine related data
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   118
    '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   119
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   120
    def __init__(self):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   121
        DataObject.__init__(self, InstallEngine.ENGINE_DOC_ROOT)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   122
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   123
    def to_xml(self):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   124
        ''' This internal engine info node will not be saved to XML '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   125
        return None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   126
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   127
    @classmethod
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   128
    def from_xml(cls, xml_node):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   129
        ''' This internal engine info node will not be read from XML '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   130
        return None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   131
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   132
    @classmethod
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   133
    def can_handle(cls, xml_node):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   134
        ''' This internal engine info node will not be read from XML '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   135
        return False
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   136
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   137
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   138
class InstallEngine(object):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   139
    ''' Install execution engine '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   140
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   141
    CP_THREAD = "CheckpointThread"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   142
    EXEC_FAILED = "Execution Failed"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   143
    EXEC_SUCCESS = "Execution Successful"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   144
    EXEC_CANCELED = "Execution Canceled"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   145
    CP_INIT_FAILED = "Checkpoint Initialization Failed"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   146
    FATAL_INTERNAL = "InstallEngineInternal"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   147
    TMP_CACHE_ENV = "TEMP_DOC_DIR"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   148
    TMP_CACHE_PATH_ROOT_DEFAULT = "/var/run/install_engine"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   149
    TMP_CACHE_PATH_PREFIX = "engine."
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   150
    CACHE_FILE_NAME_PREFIX = ".data_cache."
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   151
    CACHE_FILE_NAME = CACHE_FILE_NAME_PREFIX + "%(checkpoint)s"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   152
    SNAPSHOT_NAME = ".step_%(checkpoint)s"
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   153
    CP_COMPLETED_SUFFIX = "-completed"
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   154
    ENGINE_DOC_ROOT = "Engine-DOC-Root-Node"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   155
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   156
    NUM_CALLBACK_ARGS = 2
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   157
1350
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   158
    # progress ratio for the preparing to execute checkpoints
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   159
    EXEC_PREP_RATIO = 0.05
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   160
    EXEC_PREP_RATIO_DECIMAL = decimal.Decimal(str(EXEC_PREP_RATIO))
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   161
    PREP_MSG = "Preparing for Installation"
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   162
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   163
    _instance = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   164
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   165
    class _PseudoThread(threading.Thread):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   166
        ''' thread used for execute_checkpoints() for the blocking case '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   167
        start = threading.Thread.run
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   168
1717
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   169
    def __new__(cls, default_log, loglevel=None, debug=False,
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   170
        exclusive_rw=False, dataset=None, stop_on_error=True):
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   171
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   172
        if InstallEngine._instance is None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   173
            return object.__new__(cls)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   174
        else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   175
            raise SingletonError("InstallEngine instance already exists",
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   176
                                 InstallEngine._instance)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   177
1717
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   178
    def __init__(self, default_log, loglevel=None, debug=False,
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   179
        exclusive_rw=False, dataset=None, stop_on_error=True):
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   180
        ''' Initializes the InstallEngine
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   181
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   182
        Input:
1717
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   183
            - default_log: Required. The location of the default log for
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   184
              the application.
1418
8e9701e2c0f3 7033339 - Be able to specify logfile name when instantiate InstallLogger
Ginnie Wray<virginia.wray@oracle.com>
parents: 1350
diff changeset
   185
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   186
            - loglevel: Optional.  Defaults to None.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   187
              Logging level to use for everything: application,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   188
              engine and checkpoints.  This value is used while instantiating
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   189
              the logger.  If not specified, the default logging level for the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   190
              logging service is used.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   191
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   192
            - Debug: Optional.  Default to false.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   193
              If true, copies of DataObjectCache snapshot will not be
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   194
              removed from the directory defined to store temporary snapshots
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   195
              of DataObjectCache.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   196
1717
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   197
            - exclusive_rw: Optional. Default to false.
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   198
              If true, causes the default log file to be opened with exclusive
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   199
              read/write privileges and restrictive access to the file.
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   200
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   201
            - Dataset: Optional.  Default to None.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   202
              ZFS Dataset to be used by the engine to create ZFS snapshots
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   203
              and DataObjectCache snapshots for supporting stop and resume.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   204
              This value can be set at a later time, if not set here.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   205
              Value of ZFS dataset specified will not be validated here to
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   206
              ensure it exists.  If dataset does not exist at this point,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   207
              it will not be created.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   208
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   209
            - stop_on_error: Optional.  Default to True.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   210
              This flag controls whether checkpoint execution should continue
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   211
              if a checkpoint fails.  This value can be set at a later time,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   212
              if not set here.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   213
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   214
        Output:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   215
            None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   216
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   217
        Raises:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   218
            None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   219
        '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   220
        InstallEngine._instance = self
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   221
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   222
        # Logging must be instantiated before instantiating the DataObjectCache
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   223
        # because data object cache might need to make logging calls.
1717
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   224
        self._init_logging(default_log, loglevel, exclusive_rw)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   225
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   226
        # initialize the data object cache
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   227
        self.data_object_cache = DataObjectCache()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   228
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   229
        self.debug = debug
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   230
        self._dataset = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   231
        self.dataset = dataset
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   232
        self.stop_on_error = stop_on_error
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   233
        self.__currently_executing = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   234
1121
670325895b19 7004610 Update Text Installer to use CUD
Karen Tung <karen.tung@oracle.com>
parents: 1096
diff changeset
   235
        # Use 8 decimal precision for progress.  Using less precision
670325895b19 7004610 Update Text Installer to use CUD
Karen Tung <karen.tung@oracle.com>
parents: 1096
diff changeset
   236
        # will cause problems when the estimated progress for some
670325895b19 7004610 Update Text Installer to use CUD
Karen Tung <karen.tung@oracle.com>
parents: 1096
diff changeset
   237
        # checkpoints are drastically different than the others.
670325895b19 7004610 Update Text Installer to use CUD
Karen Tung <karen.tung@oracle.com>
parents: 1096
diff changeset
   238
        # Always round down while calculating the progress ratios
670325895b19 7004610 Update Text Installer to use CUD
Karen Tung <karen.tung@oracle.com>
parents: 1096
diff changeset
   239
        d_context = decimal.Context(prec=8, rounding=decimal.ROUND_DOWN)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   240
        decimal.setcontext(d_context)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   241
        self.__current_completed = decimal.Decimal("0")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   242
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   243
        self.__blocking_results = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   244
        self.__resume_exec_cp_ok = True
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   245
        self._checkpoints = []
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   246
        self.checkpoint_thread = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   247
        self._tmp_cache_path = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   248
        self._checkpoint_lock = threading.Lock()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   249
        self._cancel_event = threading.Event()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   250
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   251
        # The following will be set to True anytime a ZFS snapshot call is made
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   252
        self.zfs_snapshots_modifed = False
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   253
1350
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   254
        # in the process of preparing for execution
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   255
        self.exec_prep = False
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   256
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   257
    def __del__(self):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   258
        if self._tmp_cache_path is not None and not self.debug:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   259
            shutil.rmtree(self._tmp_cache_path, ignore_errors=True)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   260
        self._tmp_cache_path = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   261
1717
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   262
    def _init_logging(self, default_log, loglevel, exclusive_rw):
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   263
        ''' Initialize logging and set the loglevel if provided '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   264
        logging.setLoggerClass(InstallLogger)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   265
        global LOGGER
1418
8e9701e2c0f3 7033339 - Be able to specify logfile name when instantiate InstallLogger
Ginnie Wray<virginia.wray@oracle.com>
parents: 1350
diff changeset
   266
        LOGGER = InstallLogger.manager.getLogger(INSTALL_LOGGER_NAME,
1717
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   267
            log=default_log, level=loglevel, exclusive_rw=exclusive_rw)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   268
        InstallLogger.ENGINE = self
1717
10cb4d15a248 7066254 Problem with install/logging
Ginnie Wray<virginia.wray@oracle.com>
parents: 1418
diff changeset
   269
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   270
        if not isinstance(LOGGER, InstallLogger):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   271
            # Occurs if some module has called logging.getLogger prior to
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   272
            # this function being run. As this means we don't have control
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   273
            # over the logger associated with INSTALL_LOGGER_NAME, there's
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   274
            # a programming error and we need to abort
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   275
            raise LogInitError("Wrong logger class: got %s, expected %s" %
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   276
                               (LOGGER.__class__, InstallLogger))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   277
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   278
    @classmethod
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   279
    def get_instance(cls):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   280
        '''Returns the InstallEngine singleton'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   281
        if cls._instance is None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   282
            raise SingletonError("%s not yet initialized" % cls)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   283
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   284
        return cls._instance
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   285
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   286
    @property
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   287
    def dataset(self):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   288
        ''' Returns the ZFS dataset to used for stop/resume '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   289
        return self._dataset
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   290
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   291
    @dataset.setter
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   292
    def dataset(self, dataset):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   293
        ''' Sets the dataset to be used for stop/resume '''
1070
ef77609251f5 7021591 provide an implementation of TI/TD based on CUD
Drew Fisher <drew.fisher@oracle.com>
parents: 948
diff changeset
   294
        if dataset is not None and not isinstance(dataset, Filesystem):
ef77609251f5 7021591 provide an implementation of TI/TD based on CUD
Drew Fisher <drew.fisher@oracle.com>
parents: 948
diff changeset
   295
            dataset = Filesystem(dataset)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   296
        self._dataset = dataset
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   297
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   298
    def register_checkpoint(self, checkpoint_name, module_path,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   299
                            checkpoint_class_name, insert_before=None,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   300
                            loglevel=None, args=(), kwargs=None):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   301
        '''Input:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   302
            * checkpoint_name(required): Name used for referring to the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   303
              checkpoint after registration.  This name must be unique among
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   304
              the list of registered checkpoints.  Furthermore,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   305
              checkpoint names are restricted to have only
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   306
              ASCII letters, numbers, dots, dashes and underscore.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   307
              Length of the name must be less than 256 characters.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   308
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   309
            * module_path (required): Path of the module containing the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   310
              checkpoint implementation.  Value provided will be used in the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   311
              Python imp.find_module() call.  If a relative path is provided,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   312
              it must be resolvable by the PYTHONPATH.  If a full path is
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   313
              provided and the path is outside of
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   314
              the python sys.path, the ImportWarning will be raised.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   315
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   316
            * checkpoint_class_name(required): a string specifying the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   317
              class name of the checkpoint object to be instantiated.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   318
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   319
            * args (optional): One or more arguments can be specified for the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   320
              constructor of the checkpoint object.  The order in which the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   321
              arguments are specified will be the order in which they are
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   322
              passed.  By default, no arguments are passed.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   323
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   324
            * insert_before(optional): Insert this checkpoint before the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   325
              named checkpoint.  The named checkpoint must have been
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   326
              previously registered, and it must have not been executed.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   327
              Even though this argument comes after the *args parameter,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   328
              it will not be passed into the constructor of the checkpoint
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   329
              object.  Because Python does not allow keyword arguments to
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   330
              appear before arguments, it has to come after the args parameter.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   331
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   332
            * Log level for checkpoint(optional): If the application wants to
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   333
              use a different log level for the checkpoint, it can specify
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   334
              it using the keyword argument loglevel=<log_level>.  The
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   335
              log level specified must be valid for the log service.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   336
              The value specified in the loglevel keyword will be used by
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   337
              the engine as part of setup prior to a checkpoint's execution.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   338
              The loglevel keyword argument will not get passed into the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   339
              constructor of the checkpoint.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   340
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   341
            * kwargs(optional): One or more keyword arguments can be
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   342
              specified for the constructor of the checkpoint object.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   343
              The order in which the keyword arguments are specified will
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   344
              be the order in which they are passed.  By default, no keyword
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   345
              arguments are passed.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   346
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   347
        Output:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   348
            None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   349
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   350
        Raise:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   351
            * ImportError: Error in finding the specified module or
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   352
              checkpoint object in the module.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   353
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   354
            * ChkptRegistrationError: This error will be raised for the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   355
              any problem with registering the checkpoint.  The error message
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   356
              will indicate the exact cause of the problem.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   357
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   358
            * UnknownChkptError: Name specified in insert_before argument
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   359
              is not found.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   360
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   361
            * ChkptExecutedError: The checkpoint specified in the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   362
              insert_before argument has been executed.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   363
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   364
            * ValueError: Provided loglevel is not valid.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   365
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   366
            * ImportWarning: The provide module path from which the module
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   367
              will be imported is outside of sys.path.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   368
        '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   369
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   370
        # Checkpoint registration can not happen while checkpoint's execution
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   371
        # is in progress.  Make sure we are not in the middle of
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   372
        # executing checkpoints
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   373
        if self._is_executing_checkpoints():
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   374
            raise ChkptRegistrationError("Checkpoint registration is "
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   375
                "not allowed during checkpoint execution.")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   376
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   377
        if checkpoint_name is None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   378
            raise ChkptRegistrationError("checkpoint_name must be specified.")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   379
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   380
        if (len(checkpoint_name)) < 1 or (len(checkpoint_name) > 256):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   381
            raise ChkptRegistrationError("Length of checkpoint_name must be "
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   382
                                         "between 1-256 characters.")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   383
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   384
        # Verify checkpoint names are restricted to have only
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   385
        # ASCII letters, numbers, dots, dashes and underscore.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   386
        allowed = set(string.ascii_letters + string.digits + '.' + '-' + '_')
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   387
        if set(checkpoint_name) > allowed:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   388
            raise ChkptRegistrationError("checkpoint_name is restricted to "
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   389
                                         "have only ASCII letters, numbers, "
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   390
                                         "dots, dashes and underscore.")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   391
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   392
        if (module_path is None) or (module_path == ""):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   393
            raise ChkptRegistrationError("module_path must not be " +
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   394
                                         str(module_path))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   395
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   396
        if (checkpoint_class_name is None) or (checkpoint_class_name == ""):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   397
            raise ChkptRegistrationError("checkpoint_class_name must not be " +
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   398
                                         str(checkpoint_class_name))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   399
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   400
        LOGGER.debug("Engine registering:")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   401
        LOGGER.debug("name: " + str(checkpoint_name))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   402
        LOGGER.debug("module_path: " + str(module_path))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   403
        LOGGER.debug("checkpoint_class_name: " + str(checkpoint_class_name))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   404
        LOGGER.debug("args: " + str(args))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   405
        LOGGER.debug("kwargs: " + str(kwargs))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   406
        LOGGER.debug("insert_before: " + str(insert_before))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   407
        LOGGER.debug("log_level: " + str(loglevel))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   408
        LOGGER.debug("=============================")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   409
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   410
        # Go through list of existing checkpoints, and make sure the name
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   411
        # has not already been used, and insert_before value, if defined,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   412
        # has not been executed.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   413
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   414
        insert_index = len(self._checkpoints)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   415
        for cp in self._checkpoints:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   416
            if (cp.name == checkpoint_name):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   417
                raise ChkptRegistrationError(checkpoint_name +
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   418
                                             " has already been used.")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   419
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   420
            if (cp.name == insert_before):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   421
                if cp.completed:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   422
                    raise ChkptRegistrationError(insert_before +
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   423
                                                 " has been executed.")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   424
                else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   425
                    insert_index = self._checkpoints.index(cp)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   426
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   427
        if (insert_before is not None and
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   428
            insert_index == len(self._checkpoints)):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   429
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   430
            raise ChkptRegistrationError("insert_before checkpoint: " + \
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   431
                insert_before + "is not a valid checkpoint")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   432
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   433
        if module_path.startswith('/'):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   434
            mod_name = os.path.basename(module_path)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   435
            mod_path = os.path.dirname(module_path)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   436
        else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   437
            mod_name = module_path
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   438
            mod_path = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   439
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   440
        chkp_data = CheckpointData(checkpoint_name, mod_name, mod_path,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   441
                                   checkpoint_class_name, loglevel,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   442
                                   args, kwargs)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   443
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   444
        chkp_data.validate_checkpoint_info()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   445
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   446
        self._checkpoints.insert(insert_index, chkp_data)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   447
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   448
        LOGGER.debug("Current checkpoint list:")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   449
        if LOGGER.isEnabledFor(logging.DEBUG):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   450
            for cp in self._checkpoints:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   451
                LOGGER.debug("\t" + str(cp))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   452
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   453
    def execute_checkpoints(self, start_from=None, pause_before=None,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   454
                            dry_run=False, callback=None):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   455
        ''' Execute all checkpoints in registration order, from start_from to
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   456
            pause_before.  The checkpoint specified at pause_before is not
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   457
            executed.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   458
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   459
        Input:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   460
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   461
            * start_from: optional.  name of the checkpoint to start
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   462
              execution from. If start_from is None or not specified,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   463
              the engine will look up the first unexecuted checkpoint
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   464
              and start from there. If given, and start_from is a
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   465
              previously completed checkpoint, the engine will rollback
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   466
              to that state before execution (reverting both the persistent
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   467
              DOC and ZFS dataset, if set, in the process)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   468
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   469
            * pause_before: optional.  Name of checkpoint to stop execution at.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   470
              If pause_before is None or not specified, execution will
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   471
              continue until all registered checkpoints are executed.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   472
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   473
            * dry_run: optional.  This flag will be passed to the execute()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   474
              function of the checkpoint.  It is up to the checkpoint to
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   475
              interpret this flag.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   476
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   477
            * Callback: optional.  function to call immediately before the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   478
              thread executing checkpoints exits.  If a callback function is
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   479
              provided, execute_checkpoints() will return immediately after
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   480
              all preparation for executing checkpoints are completed.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   481
              If a callback function is not provided, the execute_checkpoints()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   482
              function will not return until the thread executing
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   483
              checkpoints exits.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   484
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   485
        Output:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   486
            * If a callback function is provided, this function
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   487
              returns nothing.  The provided callback
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   488
              function will be called with status and failed_checkpoint_list
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   489
              information as specified below.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   490
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   491
            * A tuple (status, failed_checkpoint_list) is returned if
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   492
              a callback function is not provided when the function is called.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   493
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   494
                > status: indicates whether all checkpoints are executed
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   495
                  successfully.  It will have a value of
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   496
                  InstallEngine.EXEC_SUCCESS, InstallEngine.EXEC_FAILED or
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   497
                  InstallEngine.EXEC_CANCELED or InstallEngine.CP_INIT_FAILED
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   498
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   499
                > failed_checkpoint_list: The name(s) of checkpoints failed
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   500
                  if status is InstallEngine.EXEC_FAILED or
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   501
                  InstallEngine.CP_INIT_FAILED. The
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   502
                  exception(s) raised by checkpoint's methods
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   503
                  are stored in the errsvc.  The application should look
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   504
                  up exception associated with the failed checkpoints using
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   505
                  the checkpoint name.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   506
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   507
        Raise:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   508
            * UnknownCheckpointError: Name specified in start_from or
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   509
              pause_before argument is not found
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   510
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   511
            * CheckpointOrderError: 2 conditions can cause this error:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   512
              1) There are unexecuted checkpoints before the start_from
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   513
              checkpoint.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   514
              2) start_from checkpoint is not before pause_at checkpoint.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   515
        '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   516
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   517
        blocking = callback is None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   518
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   519
        if blocking:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   520
            callback = self.__blocking_callback
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   521
            thread_cls = InstallEngine._PseudoThread
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   522
        else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   523
            thread_cls = threading.Thread
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   524
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   525
        self._check_callback(callback)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   526
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   527
        if (start_from and
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   528
            (self.get_cp_data(start_from) != self.get_first_incomplete())):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   529
            self._rollback(start_from)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   530
        checkpoint_data_list = self.get_exec_list(start_from, pause_before)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   531
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   532
        if len(checkpoint_data_list) == 0:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   533
            # unable to find any checkpoint to execute
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   534
            warnings.warn("No checkpoint will be executed based on "
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   535
                          "specified criteria.")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   536
            return (InstallEngine.EXEC_SUCCESS, [])
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   537
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   538
        if LOGGER.isEnabledFor(DEBUG):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   539
            LOGGER.debug("Engine will be executing following checkpoints:")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   540
            for cp in checkpoint_data_list:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   541
                LOGGER.debug("\t" + str(cp))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   542
1350
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   543
        thread_args = (checkpoint_data_list, dry_run, callback)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   544
        LOGGER.debug("Spawning InstallEngine execution thread")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   545
        thread = thread_cls(target=self._execute_checkpoints,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   546
                            name=InstallEngine.CP_THREAD,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   547
                            args=thread_args)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   548
        self.checkpoint_thread = thread
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   549
        thread.start()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   550
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   551
        if not blocking:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   552
            return
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   553
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   554
        if self.__blocking_results[0] == InstallEngine.FATAL_INTERNAL:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   555
            errs = errsvc.get_errors_by_mod_id(InstallEngine.FATAL_INTERNAL)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   556
            raise errs[0]
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   557
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   558
        self.checkpoint_thread = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   559
        return self.__blocking_results
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   560
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   561
    def resume_execute_checkpoints(self, start_from, pause_before=None,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   562
                                   dry_run=False, callback=None):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   563
        '''This function provides out-of-process resume functionality to
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   564
        applications. It will roll back the ZFS dataset and restore the DOC
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   565
        state to its condition just prior to the given "start_from" checkpoint.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   566
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   567
        This function may only be run once per-process. Subsequent calls
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   568
        should be done via the execute_checkpoints() function, which allows
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   569
        for in-process resume.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   570
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   571
        All parameters are identical to those from
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   572
        InstallEngine.execute_checkpoints.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   573
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   574
        In addition to the exceptions from InstallEngine.exeucute_checkpoints,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   575
        this function also raises the following exceptions.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   576
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   577
        Raise:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   578
            * RuntimeError: Unable to perform resume
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   579
            * UsageError: checkpoint specified is unresumable
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   580
        '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   581
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   582
        if not self.__resume_exec_cp_ok:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   583
            raise RuntimeError("InstallEngine.resume_execute_checkpoints"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   584
                               " may only be run once")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   585
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   586
        if self.zfs_snapshots_modifed:
1096
d795f8b803de 7036478 Additional slim_code_cleaness failures after TI/TD CUD putback
Mary Ding <mary.ding@oracle.com>
parents: 1073
diff changeset
   587
            raise RuntimeError("ZFS snapshot has been modified for this "
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   588
                              "session.  Unable to resume execute checkpoints")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   589
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   590
        resumable = self.get_resumable_checkpoints()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   591
        if start_from not in resumable:
1121
670325895b19 7004610 Update Text Installer to use CUD
Karen Tung <karen.tung@oracle.com>
parents: 1096
diff changeset
   592
            raise UsageError("'%s' is not a resumable checkpoint" % start_from)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   593
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   594
        self._rollback(start_from, resumable_cp_list=resumable)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   595
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   596
        self.__resume_exec_cp_ok = False
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   597
        return self.execute_checkpoints(start_from=start_from, dry_run=dry_run,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   598
                                        pause_before=pause_before,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   599
                                        callback=callback)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   600
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   601
    def get_resumable_checkpoints(self):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   602
        ''' Description: InstallEngine.dataset property must be set
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   603
            before calling this function.  This function loads the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   604
            DataObjectCache snapshot from the ZFS dataset, and determine
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   605
            which of the currently registered checkpoints are resumable.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   606
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   607
        Output:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   608
            List of checkpoint names that are resumable.  The order of the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   609
            checkpoint names returned will be same as their registration order.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   610
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   611
        Raise:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   612
            * NoDatasetError: ZFS dataset is not specified.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   613
            * FileNotFoundError: The specified zfs dataset is not found.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   614
        '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   615
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   616
        resumable_cp = []
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   617
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   618
        if self.dataset is None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   619
            raise NoDatasetError("ZFS dataset must be specified to get "
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   620
                                 "list of resumable checkpoints")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   621
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   622
        if not self.dataset.exists:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   623
            raise FileNotFoundError("Specified dataset %s does not exist" %
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   624
                                    self.dataset)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   625
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   626
        doc_list = self._get_doc_snapshots(self.dataset.get("mountpoint"))
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   627
        if not doc_list:
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   628
            # can't find any DOC snapshots, user will have to start from
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   629
            # first registered checkpoint.
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   630
            if self._checkpoints:
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   631
                resumable_cp.append(self._checkpoints[0].name)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   632
            return tuple(resumable_cp)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   633
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   634
        doc_path = doc_list[0]
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   635
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   636
        LOGGER.debug("Path of last DOC snapshot taken: %s", doc_path)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   637
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   638
        # load a temporary instance of DOC cache based on the lastest snapshot
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   639
        if os.path.exists(doc_path):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   640
            LOGGER.debug("Creating temp DOC based off snapshot at: %s",
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   641
                         doc_path)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   642
            temp_doc = DataObjectCache()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   643
            temp_doc.load_from_snapshot(doc_path)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   644
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   645
            name = InstallEngine.ENGINE_DOC_ROOT
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   646
            engine_doc_root = temp_doc.persistent.get_first_child(name=name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   647
        else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   648
            engine_doc_root = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   649
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   650
        prev_completed_cp = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   651
        if engine_doc_root is not None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   652
            # Get list of previously successfully executed checkpoints from doc
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   653
            prev_completed_cp = engine_doc_root.get_children()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   654
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   655
        if prev_completed_cp is None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   656
            prev_completed_cp = []
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   657
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   658
        # Get list of zfs snapshots
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   659
        zfs_snapshots = self.dataset.snapshot_list
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   660
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   661
        # Determine which of the currently registered checkpoints
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   662
        # are resumeable.  The following rules are used:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   663
        # 1) The checkpoint must be registered at exactly the same position
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   664
        #    in the checkpoint list as the previous invocation of the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   665
        #    application.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   666
        # 2) All checkpoint registration information must match between
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   667
        #    the previous and current invocation of the application.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   668
        # 3) Resumable checkpoints must have associated DataObjectCache
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   669
        #    snapshots and ZFS snapshots.  For checkpoints that does not
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   670
        #    associated ZFS snapshots in previous execution, ZFS snapshots
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   671
        #    is not required for current execution.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   672
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   673
        prev_idx = -1
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   674
        last_res_idx = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   675
        for (reg_cp, prev_cp) in zip(self._checkpoints, prev_completed_cp):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   676
            if (reg_cp.cp_info != prev_cp):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   677
                break
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   678
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   679
            reg_snapshot_path = self.get_zfs_snapshot_fullpath(reg_cp.name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   680
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   681
            if reg_snapshot_path in zfs_snapshots:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   682
                idx = zfs_snapshots.index(reg_snapshot_path)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   683
            else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   684
                idx = -1
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   685
            if idx >= prev_idx:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   686
                prev_idx = idx
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   687
                if idx != -1:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   688
                    resumable_cp.append(reg_cp.name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   689
                    last_res_idx = self._checkpoints.index(reg_cp)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   690
            else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   691
                break
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   692
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   693
        # In addition to allowing resume from any completed checkpoint,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   694
        # one may also resume from the first incomplete checkpoint.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   695
        if last_res_idx is None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   696
            # didn't find anything resumable checkpoints from prev execution.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   697
            if len(self._checkpoints) != 0:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   698
                resumable_cp.append(self._checkpoints[0].name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   699
        else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   700
            if (len(self._checkpoints)) - 1 > last_res_idx:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   701
                resumable_cp.append(self._checkpoints[last_res_idx + 1].name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   702
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   703
        return tuple(resumable_cp)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   704
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   705
    def normalize_progress(self, cp_prog):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   706
        '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   707
        Takes the percentage value provider by the InstallLogger,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   708
        and applies the progress ratio for the executing checkpoint
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   709
        to calculate the overall completed percentage.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   710
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   711
        Input:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   712
            * cp_prog: progress percentage value provided by InstallLogger.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   713
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   714
        Output:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   715
            * normalized progress value
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   716
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   717
        Raise:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   718
            None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   719
        '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   720
1350
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   721
        if self.exec_prep:
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   722
            # these are the values reported by the engine, do not
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   723
            # need to normalize
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   724
            return cp_prog
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   725
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   726
        cp_data = self.get_cp_data(self.__currently_executing.name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   727
        cp_data.prog_reported = decimal.Decimal(cp_prog)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   728
        normalized_prog = (int)(cp_prog * cp_data.prog_est_ratio)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   729
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   730
        LOGGER.debug("progress: %s, reported %s, normalized %s, total=%s" %
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   731
                     (self.__currently_executing.name, cp_prog,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   732
                     str(normalized_prog),
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   733
                     str(self.__current_completed + normalized_prog)))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   734
1151
95413393ef67 7038120 Update Auto Installer to use CUD
Darren Kenny <Darren.Kenny@Oracle.COM>
parents: 1121
diff changeset
   735
        return(str(int(self.__current_completed + normalized_prog)))
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   736
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   737
    def __blocking_callback(self, status, failed_checkpoint_list):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   738
        ''' Callback used for the blocking case of execute_checkpoints '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   739
        self.__blocking_results = (status, failed_checkpoint_list)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   740
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   741
    def _check_callback(self, callback):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   742
        '''Verifies that the callback function accepts the proper number
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   743
        of arguments, so that when called after execution, there won't be an
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   744
        exception from a mismatched function signature.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   745
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   746
        The callback function must accept at least 2 parameters, and must not
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   747
        require more than 2 parameters. (e.g., a 3rd parameter is ok if it is
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   748
        an optional keyword argument). The parameters will be called with the
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   749
        first argument being a status indicator, and the second argument being
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   750
        the contents of the errsvc.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   751
        '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   752
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   753
        if callback is None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   754
            return
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   755
        argspec = get_argspec(callback)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   756
        LOGGER.log(5, "Examining function details for callback function with"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   757
                   " signature: %s", argspec)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   758
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   759
        num_args = len(argspec.args)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   760
        if hasattr(callback, "im_self"):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   761
            if callback.im_self is None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   762
                raise TypeError("Callback cannot be an unbound method")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   763
            else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   764
                num_args -= 1   # First arg is the bound "self" arg
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   765
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   766
        if (not argspec.varargs and
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   767
            num_args < InstallEngine.NUM_CALLBACK_ARGS):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   768
            raise TypeError("callback function must accept at least 2 args:"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   769
                            " status & errsvc")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   770
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   771
        if argspec.defaults:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   772
            len_defaults = len(argspec.defaults)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   773
        else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   774
            len_defaults = 0
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   775
        if num_args - len_defaults > InstallEngine.NUM_CALLBACK_ARGS:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   776
            raise TypeError("The specified callback function requires more"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   777
                            " than 2 arguments and will fail")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   778
1350
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   779
    def _execute_checkpoints(self, checkpoint_data_list, dry_run, callback):
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   780
        '''Runs the checkpoints. The public execute_checkpoints method will
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   781
        run this function in a separate thread.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   782
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   783
        Errors occurring here will be trapped and added to the error service
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   784
        '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   785
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   786
        status = InstallEngine.EXEC_SUCCESS
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   787
        failed_checkpoint_list = []
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   788
        completed = False
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   789
1350
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   790
        # Make sure to always start at 0 progress
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   791
        self.__current_completed = 0
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   792
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   793
        (checkpoints, failed_init_cp) = self._load_checkpoints(\
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   794
            checkpoint_data_list)
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   795
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   796
        if not checkpoints:
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   797
            # one of the checkpoint must have failed to initialize, call the
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   798
            # callback function with the failure and return the
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   799
            # failures.
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   800
            LOGGER.debug(failed_init_cp + " checkpoint failed to initialize")
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   801
            callback(InstallEngine.CP_INIT_FAILED, [failed_init_cp])
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   802
            with self._checkpoint_lock:
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   803
                self.__currently_executing = None
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   804
            return
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   805
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   806
        try:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   807
            for checkpoint in checkpoints:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   808
                with self._checkpoint_lock:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   809
                    # Determine whether the execution has
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   810
                    # been canceled. (Acquire the lock to ensure that
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   811
                    # cancel_checkpoints() isn't attempting to cancel
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   812
                    # __currently_executing).
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   813
                    if self._cancel_event.is_set():
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   814
                        status = InstallEngine.EXEC_CANCELED
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   815
                        failed_checkpoint_list.append(
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   816
                            self.__currently_executing.name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   817
                        break
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   818
                    self.__currently_executing = checkpoint
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   819
                cp_data = self.get_cp_data(checkpoint.name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   820
948
6bff7ea9c858 6997606 Resuming from previously failed checkpoint does not work correctly
Karen Tung <karen.tung@oracle.com>
parents: 947
diff changeset
   821
                # Take a snapshot of the state before executing the checkpoint.
1418
8e9701e2c0f3 7033339 - Be able to specify logfile name when instantiate InstallLogger
Ginnie Wray<virginia.wray@oracle.com>
parents: 1350
diff changeset
   822
                # This snapshot, which is associated with the checkpoint's
8e9701e2c0f3 7033339 - Be able to specify logfile name when instantiate InstallLogger
Ginnie Wray<virginia.wray@oracle.com>
parents: 1350
diff changeset
   823
                # name, is for resuming at the named checkpoint.
948
6bff7ea9c858 6997606 Resuming from previously failed checkpoint does not work correctly
Karen Tung <karen.tung@oracle.com>
parents: 947
diff changeset
   824
                if status is InstallEngine.EXEC_SUCCESS:
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   825
                    self.snapshot(cp_data=cp_data)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   826
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   827
                try:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   828
                    LOGGER.debug("Executing %s checkpoint", checkpoint.name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   829
                    checkpoint.execute(dry_run)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   830
                except BaseException as exception:
948
6bff7ea9c858 6997606 Resuming from previously failed checkpoint does not work correctly
Karen Tung <karen.tung@oracle.com>
parents: 947
diff changeset
   831
                    LOGGER.exception("Error occurred during execution "
6bff7ea9c858 6997606 Resuming from previously failed checkpoint does not work correctly
Karen Tung <karen.tung@oracle.com>
parents: 947
diff changeset
   832
                                     "of '%s' checkpoint." % checkpoint.name)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   833
                    completed = False
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   834
                    error_info = errsvc.ErrorInfo(checkpoint.name,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   835
                                                  liberrsvc.ES_ERR)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   836
                    error_info.set_error_data(liberrsvc.ES_DATA_EXCEPTION,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   837
                                              exception)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   838
                    failed_checkpoint_list.append(checkpoint.name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   839
                    status = InstallEngine.EXEC_FAILED
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   840
                    if self.stop_on_error:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   841
                        if (self.debug and
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   842
                            isinstance(self.checkpoint_thread,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   843
                                       InstallEngine._PseudoThread)):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   844
                            raise
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   845
                        else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   846
                            break
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   847
                else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   848
                    # Checkpoint completed successfully without exceptions
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   849
                    completed = True
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   850
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   851
                self._engine_doc_root.insert_children(cp_data.cp_info)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   852
                cp_data.completed = completed
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   853
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   854
                # Inform logger that the checkpoint has completed.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   855
                # This is to ensure that progress is being reported
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   856
                # even if checkpoints don't report progress themselves
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   857
                if cp_data.prog_reported < 100:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   858
                    LOGGER.report_progress(msg=cp_data.name + " completed.",
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   859
                                           progress=100)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   860
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   861
                # keep track of completed percentage
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   862
                self.__current_completed += cp_data.prog_est_ratio * 100
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   863
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   864
                # Take a snapshot of the state after executing the checkpoint.
1418
8e9701e2c0f3 7033339 - Be able to specify logfile name when instantiate InstallLogger
Ginnie Wray<virginia.wray@oracle.com>
parents: 1350
diff changeset
   865
                # if it is successful.
948
6bff7ea9c858 6997606 Resuming from previously failed checkpoint does not work correctly
Karen Tung <karen.tung@oracle.com>
parents: 947
diff changeset
   866
                if status is InstallEngine.EXEC_SUCCESS:
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   867
                    self.snapshot(self._get_completed_name(cp_data.name))
948
6bff7ea9c858 6997606 Resuming from previously failed checkpoint does not work correctly
Karen Tung <karen.tung@oracle.com>
parents: 947
diff changeset
   868
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   869
        except BaseException as exception:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   870
            # Fatal error in InstallEngine - abort regardless of issue
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   871
            LOGGER.exception("Aborting: Internal error in InstallEngine")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   872
            status = InstallEngine.FATAL_INTERNAL
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   873
            error_info = errsvc.ErrorInfo(status, liberrsvc.ES_ERR)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   874
            error_info.set_error_data(liberrsvc.ES_DATA_EXCEPTION,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   875
                                      exception)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   876
            failed_checkpoint_list.insert(0, status)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   877
            # If we're in the main thread, raise this fatal error up.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   878
            if isinstance(self.checkpoint_thread,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   879
                          InstallEngine._PseudoThread):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   880
                raise
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   881
        finally:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   882
            with self._checkpoint_lock:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   883
                self.__currently_executing = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   884
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   885
        callback(status, failed_checkpoint_list)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   886
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   887
    def snapshot(self, snapname=None, cp_data=None):
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   888
        '''Snapshots the current DOC state (and ZFS dataset, if it exists)'''
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   889
        if cp_data is not None:
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   890
            snapshot_name = cp_data.name
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   891
        else:
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   892
            snapshot_name = snapname
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   893
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   894
        filename = self.get_cache_filename(snapshot_name)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   895
        LOGGER.debug("Snapshotting DOC to %s", filename)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   896
        self.data_object_cache.take_snapshot(filename)
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   897
        if cp_data is not None:
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   898
            cp_data.data_cache_path = filename
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   899
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   900
        if self.dataset is not None and self.dataset.exists:
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   901
            snap_name = self.get_zfs_snapshot_name(snapshot_name)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   902
            LOGGER.debug("Taking zfs snapshot: %s", snap_name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   903
            self.dataset.snapshot(snap_name, overwrite=True)
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   904
            if cp_data is not None:
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   905
                cp_data.zfs_snap = snap_name
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   906
            self.zfs_snapshots_modifed = True
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   907
        else:
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   908
            if cp_data is not None:
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
   909
                cp_data.zfs_snap = None
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   910
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   911
    def _load_checkpoints(self, checkpoint_data_list):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   912
        '''Load checkpoint modules to get the executable checkpoints
1418
8e9701e2c0f3 7033339 - Be able to specify logfile name when instantiate InstallLogger
Ginnie Wray<virginia.wray@oracle.com>
parents: 1350
diff changeset
   913
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   914
           Input:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   915
               checkpoint_data_list: list of checkpoints to be executed.  This
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   916
                                     is a list of CheckpointInfo objects.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   917
           Output:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   918
               * list of instantiated checkpoint objects, if no instantiation
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   919
                 failure occurred.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   920
               * name of the checkpoint that failed to instantiate.  The
1418
8e9701e2c0f3 7033339 - Be able to specify logfile name when instantiate InstallLogger
Ginnie Wray<virginia.wray@oracle.com>
parents: 1350
diff changeset
   921
                 exact traceback from the failure is registered with the
1096
d795f8b803de 7036478 Additional slim_code_cleaness failures after TI/TD CUD putback
Mary Ding <mary.ding@oracle.com>
parents: 1073
diff changeset
   922
                 errsvc.
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   923
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   924
           Raises:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   925
               * None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   926
        '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   927
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   928
        if len(checkpoint_data_list) == 0:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   929
            # to protect against an empty list being passed in.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   930
            return([], None)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   931
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   932
        execute_these = []
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   933
        total_estimate = decimal.Decimal('0')
1350
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   934
        self.exec_prep = True
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   935
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   936
        num_cp_to_load = float(len(checkpoint_data_list))
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   937
        num_cp_loaded = 0
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   938
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   939
        for cp_data in checkpoint_data_list:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   940
            LOGGER.debug("Loading %s checkpoint", cp_data)
1350
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   941
            load_prog = int((num_cp_loaded / num_cp_to_load) * \
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   942
                InstallEngine.EXEC_PREP_RATIO * 100)
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   943
            LOGGER.report_progress(msg=InstallEngine.PREP_MSG,
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   944
                                   progress=load_prog)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   945
            try:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   946
                checkpoint = cp_data.load_checkpoint()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   947
                prog_est = checkpoint.get_progress_estimate()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   948
            except BaseException as exception:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   949
                LOGGER.exception("Uncaught exception from '%s' checkpoint init"
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   950
                                     % cp_data.name)
922
f6d3871f2b3e 6997663 Change an error message to be more user friendly for an invalid pause checkpoint name
Karen Tung <karen.tung@oracle.com>
parents: 913
diff changeset
   951
                error_info = errsvc.ErrorInfo(cp_data.name, liberrsvc.ES_ERR)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   952
                error_info.set_error_data(liberrsvc.ES_DATA_EXCEPTION,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   953
                                          exception)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   954
                return ([], cp_data.name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   955
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   956
            if prog_est <= 0:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   957
                # Take care of the case where get_progress_estimate() returning
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   958
                # invalid value
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   959
                prog_est = 1
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   960
            cp_data.prog_est = decimal.Decimal(str(prog_est))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   961
            total_estimate += cp_data.prog_est
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   962
            execute_these.append(checkpoint)
1350
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   963
            num_cp_loaded += 1
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   964
1350
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   965
        self.exec_prep = False
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   966
        self.__current_completed += InstallEngine.EXEC_PREP_RATIO_DECIMAL * 100
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   967
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   968
        total_ratio = InstallEngine.EXEC_PREP_RATIO_DECIMAL
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   969
        adjusted_ratio = decimal.Decimal(str(1 - \
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   970
                                         InstallEngine.EXEC_PREP_RATIO))
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   971
        for cp_data in checkpoint_data_list:
1350
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   972
            cp_data.prog_est_ratio = (cp_data.prog_est / total_estimate) * \
025c6311d0d9 7071386 Improve progress reporting for text installer and GUI installer
Karen Tung <Karen.Tung@oracle.com>
parents: 1308
diff changeset
   973
                adjusted_ratio
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   974
            total_ratio += cp_data.prog_est_ratio
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   975
            LOGGER.debug("%s: prog est-%s, prog ratio-%s, total_ratio-%s" %
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   976
                        (cp_data.name, str(cp_data.prog_est),
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   977
                         str(cp_data.prog_est_ratio), str(total_ratio)))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   978
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   979
        # Just in case the total ratio didn't add up to 100% because
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   980
        # of rounding down, adjust it in the last checkpoint
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   981
        checkpoint_data_list[-1].prog_est_ratio += \
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   982
            decimal.Decimal("1") - total_ratio
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   983
        LOGGER.debug("Last checkpoint, %s: prog ratio %s" %
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   984
                     (checkpoint_data_list[-1].name,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   985
                     str(checkpoint_data_list[-1].prog_est_ratio)))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   986
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   987
        return (execute_these, None)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   988
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   989
    def get_exec_list(self, start_from=None, pause_before=None):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   990
        '''Returns the list of checkpoints to execute based on the desired
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   991
        start/end checkpoint names
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   992
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   993
        Input:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   994
            start_from: name of checkpoint to start execution.  Optional.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   995
            pause_before: name of checkpoint to pause execution.  Optional.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   996
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   997
        Output:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   998
            List of checkpoints to be executed.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
   999
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1000
        Raises:
1418
8e9701e2c0f3 7033339 - Be able to specify logfile name when instantiate InstallLogger
Ginnie Wray<virginia.wray@oracle.com>
parents: 1350
diff changeset
  1001
            UsageError: There are unexecuted checkpoints before the
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1002
                        checkpoint specified to start execution from.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1003
            UnknownChkptError: Name specified for start_from and pause_before
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1004
                               is not valid.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1005
        '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1006
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1007
        exec_list = []
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1008
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1009
        if start_from is None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1010
            start_from_cp = self.get_first_incomplete()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1011
            if start_from_cp is None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1012
                # All checkpoints completed, so continuing where the engine
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1013
                # left off is a no-op - return the empty list
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1014
                return exec_list
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1015
            else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1016
                start_from = start_from_cp.name
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1017
        LOGGER.debug("Retrieving checkpoint list from %s to %s", start_from,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1018
                     pause_before)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1019
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1020
        # Examine all checkpoints. For checkpoints prior to the one indicated
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1021
        # by start_from (while found_start is False), ensure that they've been
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1022
        # completed so that we only resume from a completed checkpoint.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1023
        found_start = False
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1024
        for cp in self._checkpoints:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1025
            if cp.name == start_from:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1026
                # Found the start_from checkpoint - start adding
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1027
                # to the exec list
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1028
                found_start = True
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1029
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1030
            if found_start and cp.name == pause_before:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1031
                # Pause before this checkpoint - stop adding checkpoints
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1032
                # to the exec_list
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1033
                if found_start:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1034
                    break
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1035
                else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1036
                    raise UsageError("Specified pause_before checkpoint, %s, "
1096
d795f8b803de 7036478 Additional slim_code_cleaness failures after TI/TD CUD putback
Mary Ding <mary.ding@oracle.com>
parents: 1073
diff changeset
  1037
                                     "is registered after specified "
1418
8e9701e2c0f3 7033339 - Be able to specify logfile name when instantiate InstallLogger
Ginnie Wray<virginia.wray@oracle.com>
parents: 1350
diff changeset
  1038
                                     "start_from checkpoint, %s" %
1096
d795f8b803de 7036478 Additional slim_code_cleaness failures after TI/TD CUD putback
Mary Ding <mary.ding@oracle.com>
parents: 1073
diff changeset
  1039
                                     (pause_before, start_from))
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1040
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1041
            if found_start:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1042
                exec_list.append(cp)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1043
            elif not cp.completed:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1044
                raise UsageError("Invalid start checkpoint. "
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1045
                                 "Previous checkpoint (%s) not completed." %
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1046
                                 cp.name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1047
        else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1048
            # After "found_start", keep adding checkpoints until pause_before.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1049
            # If the pause_before checkpoint is not found, but pause_before
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1050
            # was specified, it's an error
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1051
            if not found_start:
922
f6d3871f2b3e 6997663 Change an error message to be more user friendly for an invalid pause checkpoint name
Karen Tung <karen.tung@oracle.com>
parents: 913
diff changeset
  1052
                raise UnknownChkptError("'%s' is not a valid checkpoint"
1096
d795f8b803de 7036478 Additional slim_code_cleaness failures after TI/TD CUD putback
Mary Ding <mary.ding@oracle.com>
parents: 1073
diff changeset
  1053
                                        " to start execution from." %
d795f8b803de 7036478 Additional slim_code_cleaness failures after TI/TD CUD putback
Mary Ding <mary.ding@oracle.com>
parents: 1073
diff changeset
  1054
                                          start_from)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1055
            if pause_before is not None:
922
f6d3871f2b3e 6997663 Change an error message to be more user friendly for an invalid pause checkpoint name
Karen Tung <karen.tung@oracle.com>
parents: 913
diff changeset
  1056
                raise UnknownChkptError("'%s' is not a valid checkpoint"
1096
d795f8b803de 7036478 Additional slim_code_cleaness failures after TI/TD CUD putback
Mary Ding <mary.ding@oracle.com>
parents: 1073
diff changeset
  1057
                                        " to pause execution at." %
d795f8b803de 7036478 Additional slim_code_cleaness failures after TI/TD CUD putback
Mary Ding <mary.ding@oracle.com>
parents: 1073
diff changeset
  1058
                                          pause_before)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1059
        return tuple(exec_list)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1060
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1061
    def get_cp_data(self, name):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1062
        '''Helper method for retrieving a CheckpointData object by name'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1063
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1064
        for cp in self._checkpoints:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1065
            if cp.name == name:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1066
                return cp
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1067
        raise UnknownChkptError("'%s' is not a registered checkpoint" % name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1068
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1069
    def get_first_incomplete(self):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1070
        '''Return the first checkpoint that has not yet been run'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1071
        for cp in self._checkpoints:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1072
            if not cp.completed:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1073
                return cp
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1074
        return None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1075
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1076
    def get_cache_filename(self, cp_name):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1077
        '''Returns the filename of the DOC dump for the given checkpoint'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1078
        if self.dataset is not None and self.dataset.exists:
1070
ef77609251f5 7021591 provide an implementation of TI/TD based on CUD
Drew Fisher <drew.fisher@oracle.com>
parents: 948
diff changeset
  1079
            path = self.dataset.get("mountpoint")
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1080
        else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1081
            path = self._tmp_cache_path
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1082
            if path is None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1083
                path = self._gen_tmp_dir()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1084
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1085
        filename = InstallEngine.CACHE_FILE_NAME % {"checkpoint": cp_name}
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1086
        full_path = os.path.join(path, filename)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1087
        return full_path
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1088
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1089
    def _gen_tmp_dir(self):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1090
        '''Determine where temporary DOC files should be stored'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1091
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1092
        # if the TEMP_DOC_DIR env variable is defined, use that value
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1093
        # for the temporary DOC directory.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1094
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1095
        if InstallEngine.TMP_CACHE_ENV in os.environ:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1096
            doc_path = os.environ[InstallEngine.TMP_CACHE_ENV]
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1097
            if not os.path.exists(doc_path):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1098
                os.makedirs(doc_path)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1099
        else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1100
            prefix = InstallEngine.TMP_CACHE_PATH_PREFIX
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1101
            doc_dir = InstallEngine.TMP_CACHE_PATH_ROOT_DEFAULT
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1102
            if not os.path.exists(doc_dir):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1103
                os.makedirs(doc_dir)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1104
            doc_path = tempfile.mkdtemp(prefix=prefix, dir=doc_dir)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1105
        self._tmp_cache_path = doc_path
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1106
        return doc_path
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1107
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1108
    def get_zfs_snapshot_name(self, cp_name):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1109
        '''Returns the ZFS snapshot name for the given checkpoint'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1110
        return InstallEngine.SNAPSHOT_NAME % {"checkpoint": cp_name}
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1111
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1112
    def get_zfs_snapshot_fullpath(self, cp_name):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1113
        '''Returns the full ZFS snapshot path for the given checkpoint'''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1114
        snap_name = self.get_zfs_snapshot_name(cp_name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1115
        return(self.dataset.snapname(snap_name))
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1116
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1117
    @property
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1118
    def doc(self):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1119
        ''' return data object cache instantiated by the engine '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1120
        return self.data_object_cache
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1121
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1122
    @property
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1123
    def _engine_doc_root(self):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1124
        ''' Returns the root node for storing engine related info in DOC '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1125
        name = InstallEngine.ENGINE_DOC_ROOT
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1126
        node = self.doc.persistent.get_first_child(name=name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1127
        if node is None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1128
            node = EngineData()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1129
            self.doc.persistent.insert_children(node)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1130
        return node
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1131
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1132
    def _rollback(self, before_cp, resumable_cp_list=None):
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1133
        '''Revert the engine to the given Checkpoint (by name):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1134
            * If the checkpoint was snapshotted via ZFS, rollback to that
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1135
            * Additionally, rollback the DOC
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1136
        Raises:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1137
            IOError: If the DOC snapshot can't be found or can't be read
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1138
            RollbackError: If the engine doesn't have a valid ZFS dataset
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1139
                           to do an out-of-process rollback from
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1140
        '''
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1141
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1142
        cp_data = self.get_cp_data(before_cp)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1143
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1144
        LOGGER.debug("Going to rollback to %s", before_cp)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1145
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1146
        if cp_data.completed:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1147
            # In-process resume
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1148
            cache_file = cp_data.data_cache_path
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1149
            snap_name = cp_data.zfs_snap
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1150
            if cache_file is None:
1308
837baaf7608b 7068197 nosexunit test failure in solaris_install/engine/__init__.py
Sreedhar Chalamalasetti <sreedhar.chalamalasetti@oracle.com>
parents: 1290
diff changeset
  1151
                raise RollbackError(before_cp,
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1152
                                    "Checkpoint has no data cache")
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1153
        else:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1154
            # Out of process resume
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1155
            if self.dataset is None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1156
                # Application needs to set ZFS dataset before
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1157
                # calling InstallEngine.rollback(...)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1158
                raise RollbackError(before_cp, "A ZFS dataset is required to "
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1159
                                    "rollback to this checkpoint")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1160
            cache_file = self.get_cache_filename(cp_data.name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1161
            snap_name = self.get_zfs_snapshot_name(cp_data.name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1162
            long_snap_name = self.dataset.snapname(snap_name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1163
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1164
            if long_snap_name not in self.dataset.snapshot_list:
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1165
                if resumable_cp_list and (before_cp == resumable_cp_list[-1]):
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1166
                    # Take care of the case where the checkpoint to resume
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1167
                    # from is not previously executed.  Use the "completed"
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1168
                    # snapshot from the previous checkpoint.
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1169
                    index = resumable_cp_list.index(before_cp)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1170
                    if index == 0:
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1171
                        LOGGER.debug("First checkpoint is different than"
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1172
                                     "previous first checkpoint, "
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1173
                                     "no rollback necessary.")
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1174
                        return
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1175
                    completed_name = self._get_completed_name(\
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1176
                        resumable_cp_list[index - 1])
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1177
                    LOGGER.debug("Going to use snapshot %s", completed_name)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1178
                    cache_file = self.get_cache_filename(completed_name)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1179
                    snap_name = self.get_zfs_snapshot_name(completed_name)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1180
                    long_snap_name = self.dataset.snapname(snap_name)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1181
                    if long_snap_name not in self.dataset.snapshot_list:
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1182
                        raise RollbackError(before_cp,
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1183
                                            "Missing required ZFS snapshot "
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1184
                                            "[%s]" % long_snap_name)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1185
                else:
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1186
                    raise RollbackError(before_cp,
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1187
                                        "Missing required ZFS snapshot "
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1188
                                        "[%s]" % long_snap_name)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1189
        if snap_name is not None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1190
            self.dataset.rollback(snap_name, recursive=True)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1191
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1192
        if not os.path.exists(cache_file):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1193
            raise NoCacheError(before_cp, cache_file)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1194
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1195
        self.doc.load_from_snapshot(cache_file)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1196
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1197
        # Reset the 'completed' state of all registered checkpoints,
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1198
        # based on how far the engine was rolled back
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1199
        completed = True
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1200
        for checkpoint in self._checkpoints:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1201
            if checkpoint.name == before_cp:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1202
                completed = False
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1203
            checkpoint.completed = completed
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1204
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1205
    def cancel_checkpoints(self):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1206
        '''Cancels currently executing checkpoints. If no checkpoints are
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1207
        currently running, this is a no-op.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1208
        '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1209
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1210
        with self._checkpoint_lock:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1211
            # Use the _checkpoint_lock to ensure that
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1212
            # __currently_executing doesn't change after being canceled.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1213
            self._cancel_event.set()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1214
            if self.__currently_executing is not None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1215
                self.__currently_executing.cancel()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1216
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1217
        if self.checkpoint_thread is not None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1218
            self.checkpoint_thread.join()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1219
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1220
        self._cancel_event.clear()
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1221
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1222
    def cleanup_checkpoints(self):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1223
        ''' Removes ZFS and DataObjectCache snapshots associated with
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1224
            currently registered checkpoints.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1225
        '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1226
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1227
        # Checkpoint cleanup can not happen while checkpoints execution
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1228
        # is in progress.  Make sure we are not in the middle of
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1229
        # executing checkpoints
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1230
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1231
        if self._is_executing_checkpoints():
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1232
            raise EngineError("Checkpoint cleanup is "
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1233
                              "not allowed during checkpoint execution.")
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1234
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1235
        if self.dataset is not None and self.dataset.exists:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1236
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1237
            # Get list of zfs snapshots
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1238
            zfs_snapshots = self.dataset.snapshot_list
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1239
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1240
            for cp_data in self._checkpoints:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1241
                # Will attempt to look for ZFS snapshots from
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1242
                # all checkpoints, including those that is not completed
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1243
                # in this process.  If a checkpoint exists, destroy it.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1244
                # If it doesn't exist, continue on.
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1245
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1246
                # first delete the "completed" snapshot for a given
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1247
                # checkpoint, then, delete the snapshot taken prior to
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1248
                # executing the checkpoint.
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1249
                completed_cp_name = self._get_completed_name(cp_data.name)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1250
                snap_path = self.get_zfs_snapshot_fullpath(completed_cp_name)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1251
                if snap_path in zfs_snapshots:
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1252
                    snap_name = self.get_zfs_snapshot_name(completed_cp_name)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1253
                    self.dataset.destroy(dry_run=False, snapshot=snap_name)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1254
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1255
                snap_path = self.get_zfs_snapshot_fullpath(cp_data.name)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1256
                if snap_path in zfs_snapshots:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1257
                    snap_name = self.get_zfs_snapshot_name(cp_data.name)
1073
7ff3ee2fcf57 7036435 Additional install unit tests failures after TI/TD CUD putback
Drew Fisher <drew.fisher@oracle.com>
parents: 1070
diff changeset
  1258
                    self.dataset.destroy(dry_run=False, snapshot=snap_name)
909
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1259
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1260
        if self._tmp_cache_path is not None:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1261
            shutil.rmtree(self._tmp_cache_path)
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1262
            self._tmp_cache_path = None
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1263
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1264
        # since all checkpoint DOC and/or ZFS snapshots are removed, unset
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1265
        # the completed flag for the checkpoints because they can no longer
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1266
        # be rolled back to.
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1267
        for cp_data in self._checkpoints:
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1268
            cp_data.completed = False
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1269
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1270
    def _is_executing_checkpoints(self):
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1271
        ''' determine whether the engine is currently executing checkpoints '''
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1272
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1273
        return ((self.checkpoint_thread is not None) and
ab25dde8919d 16323 Implement Install Execution Engine
Karen Tung <karen.tung@oracle.com>
parents:
diff changeset
  1274
                (self.checkpoint_thread.is_alive()))
1290
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1275
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1276
    def _get_doc_snapshots(self, root_dir):
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1277
        ''' Find all DOC cache snapshot files, and return them in a sorted
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1278
            list with the last created file first.
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1279
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1280
            args:
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1281
                root_dir: The directory in which to find the snapshot files
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1282
        '''
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1283
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1284
        if root_dir is None:
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1285
            raise EngineError("Provided root directory to search for DOC "
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1286
                              "snapshots is None.")
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1287
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1288
        file_list_with_time = list()
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1289
        doc_snapshot_wildcard = InstallEngine.CACHE_FILE_NAME_PREFIX + "*"
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1290
        for doc_snap in glob.glob(os.path.join(root_dir,
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1291
                                               doc_snapshot_wildcard)):
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1292
            stat = os.stat(doc_snap)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1293
            time_and_file_tuple = stat.st_mtime, doc_snap
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1294
            file_list_with_time.append(time_and_file_tuple)
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1295
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1296
        file_list_with_time.sort()
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1297
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1298
        result = [doc_file[1] for doc_file in file_list_with_time]
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1299
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1300
        return tuple(reversed(result))
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1301
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1302
    def _get_completed_name(self, cp_name):
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1303
        '''Return the name to use for checkpoint completed snapshot '''
cfaa7349f221 7004000 Install engine enhancement to save original args/kwargs list before calling checkpoint's execute
Karen Tung <Karen.Tung@oracle.com>
parents: 1151
diff changeset
  1304
        return (cp_name + InstallEngine.CP_COMPLETED_SUFFIX)