src/modules/client/imageplan.py
author Brock Pytlik <bpytlik@sun.com>
Mon, 16 Aug 2010 16:48:50 -0700
changeset 2026 d1b30615bc99
parent 2003 16461c9acfee
child 2034 d5ee7746faeb
permissions -rw-r--r--
9196 pkg(5) should have support for cryptographic manifest signatures 11611 pkg5 should provide for hash validation on manifests 16654 Expose ability to upload by file path
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1516
8c950a3b4171 10485 move pkg(5) to Python 2.6
Rich Burridge <rich.burridge@sun.com>
parents: 1505
diff changeset
     1
#!/usr/bin/python
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     2
#
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     3
# CDDL HEADER START
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     4
#
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     8
#
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    12
# and limitations under the License.
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    13
#
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    19
#
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    20
# CDDL HEADER END
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    21
#
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    22
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
    23
#
1924
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
    24
# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
    25
#
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    26
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
    27
from collections import namedtuple
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    28
import errno
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    29
import operator
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
    30
import os
1286
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
    31
import traceback
956
adf6bdfdb3b5 6904 image.installed_file_authority always tries to open installed file r+
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 941
diff changeset
    32
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1369
diff changeset
    33
from pkg.client import global_settings
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1369
diff changeset
    34
logger = global_settings.logger
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1369
diff changeset
    35
1306
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
    36
import pkg.actions
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    37
import pkg.catalog
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    38
import pkg.client.actuator   as actuator
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    39
import pkg.client.indexer    as indexer
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
    40
import pkg.client.api_errors as api_errors
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    41
import pkg.client.pkgplan    as pkgplan
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    42
import pkg.client.pkg_solver as pkg_solver
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    43
import pkg.fmri
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    44
import pkg.manifest          as manifest
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    45
import pkg.search_errors     as se
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    46
import pkg.version
1755
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
    47
import sys
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
    48
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    49
from pkg.client.debugvalues import DebugValues
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    50
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
    51
UNEVALUATED       = 0 # nothing done yet
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
    52
EVALUATED_PKGS    = 1 # established fmri changes
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
    53
EVALUATED_OK      = 2 # ready to execute
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
    54
PREEXECUTED_OK    = 3 # finished w/ preexecute
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
    55
PREEXECUTED_ERROR = 4 # whoops
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
    56
EXECUTED_OK       = 5 # finished execution
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
    57
EXECUTED_ERROR    = 6 # failed
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    58
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    59
class ImagePlan(object):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    60
        """ImagePlan object contains the plan for changing the image...
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    61
        there are separate routines for planning the various types of
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    62
        image modifying operations; evaluation (comparing manifests
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    63
        and buildig lists of removeal, install and update actions
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    64
        and their execution is all common code"""
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    65
1832
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
    66
        PLANNED_NOTHING   = "no-plan"
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
    67
        PLANNED_INSTALL   = "install"
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
    68
        PLANNED_UNINSTALL = "uninstall"
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
    69
        PLANNED_UPDATE    = "image-update"
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
    70
        PLANNED_FIX       = "fix"
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
    71
        PLANNED_VARIANT   = "change-variant"
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
    72
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    73
        def __init__(self, image, progtrack, check_cancel, noexecute=False):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    74
                self.image = image
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    75
                self.pkg_plans = []
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    76
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    77
                self.state = UNEVALUATED
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    78
                self.__progtrack = progtrack
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    79
                self.__noexecute = noexecute
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    80
                
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    81
                self.__fmri_changes = [] # install  (None, fmri)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    82
                                         # update   (oldfmri, newfmri)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    83
                                         # remove   (oldfmri, None)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    84
                                         # reinstall(oldfmri, oldfmri)
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    85
1784
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
    86
                # Used to track users and groups that are part of operation.
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
    87
                self.added_groups = {}
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
    88
                self.removed_groups = {}
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
    89
                self.added_users = {}
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
    90
                self.removed_users = {}
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
    91
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    92
                self.update_actions  = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    93
                self.removal_actions = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
    94
                self.install_actions = []
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
    95
1859
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
    96
                # The set of processed target object directories known to be
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
    97
                # valid (those that are not symlinks and thus are valid for
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
    98
                # use during installation).  This is used by the pkg.actions
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
    99
                # classes during install() operations.
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
   100
                self.valid_directories = set()
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
   101
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   102
                # A place to keep info about saved_files; needed by file action.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   103
                self.saved_files = {}
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   104
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   105
                self.__target_install_count = 0
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   106
                self.__target_update_count  = 0
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   107
                self.__target_removal_count = 0
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   108
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   109
                self.__directories = None  # implement ref counting
1924
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   110
                self.__symlinks = None     # for dirs and links and
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   111
                self.__hardlinks = None    # hardlinks
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   112
                self.__cached_actions = {} 
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   113
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   114
                self.__old_excludes = image.list_excludes()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   115
                self.__new_excludes = self.__old_excludes
111
647c91609117 Client-side filtering.
Danek Duvall <danek.duvall@sun.com>
parents: 67
diff changeset
   116
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   117
                self.__check_cancelation = check_cancel
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 717
diff changeset
   118
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   119
                self.__actuators = None
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   120
598
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
   121
                self.update_index = True
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
   122
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   123
                self.__preexecuted_indexing_error = None
1832
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   124
                self._planned_op = self.PLANNED_NOTHING
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   125
                self.__pkg_solver = None
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   126
                self.__new_variants = None
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   127
                self.__new_facets = None
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   128
                self.__variant_change = False
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   129
                self.__references = {} # dict of fmri -> pattern
1286
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
   130
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   131
        def __str__(self):
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   132
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   133
                if self.state == UNEVALUATED:
63
ba3a4af65479 add -R/$PKG_IMAGE to pkg, and -n and -v to install
Danek Duvall <danek.duvall@sun.com>
parents: 60
diff changeset
   134
                        s = "UNEVALUATED:\n"
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   135
                        return s
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   136
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   137
                s = "%s\n" % self.__pkg_solver 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   138
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   139
                if self.state < EVALUATED_PKGS:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   140
                        return s
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   141
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   142
                s += "Package version changes:\n"
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   143
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   144
                for pp in self.pkg_plans:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   145
                        s += "%s -> %s\n" % (pp.origin_fmri, pp.destination_fmri)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   146
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   147
                if self.__actuators:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   148
                        s = s + "Actuators:\n%s\n" % self.__actuators
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   149
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   150
                if self.__old_excludes != self.__new_excludes:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   151
                        s = s + "Variants/Facet changes: %s -> %s\n" % (self.__old_excludes,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   152
                            self.__new_excludes)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   153
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   154
                return s
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   155
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   156
        def __verbose_str(self):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   157
                s = str(self)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   158
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   159
                if self.state == EVALUATED_PKGS:
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   160
                        return s
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   161
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   162
                s = s + "Actions being removed:\n"
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   163
                for pplan, o_action, ignore in self.removal_actions:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   164
                        s = s + "\t%s:%s\n" % ( pplan.origin_fmri, o_action)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   165
                
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   166
                s = s + "\nActions being updated:\n"
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   167
                for pplan, o_action, d_action in self.update_actions:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   168
                        s = s + "\t%s:%s -> %s%s\n" % ( 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   169
                            pplan.origin_fmri, o_action,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   170
                            pplan.destination_fmri, d_action )
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   171
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   172
                s = s + "\nActions being installed:\n"
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   173
                for pplan, ignore, d_action in self.removal_actions:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   174
                        s = s + "\t%s:%s\n" % ( pplan.destination_fmri, d_action)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   175
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   176
                return s
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   177
1832
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   178
        @property
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   179
        def planned_op(self):
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   180
                """Returns a constant value indicating the type of operation
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   181
                planned."""
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   182
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   183
                return self._planned_op
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   184
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   185
        def show_failure(self, verbose):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   186
                """Here's where extensive messaging needs to go"""
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   187
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   188
                if self.__pkg_solver:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   189
                        logger.info(_("Planning for %s failed: %s\n") % 
1832
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   190
                            (self._planned_op, self.__pkg_solver.gen_failure_report(verbose)))
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   191
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   192
        def __plan_op(self, op):
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   193
                """Private helper method used to mark the start of a planned
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   194
                operation."""
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   195
1832
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   196
                self._planned_op = op
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   197
                self._image_lm = self.image.get_last_modified()
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   198
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   199
        def plan_install(self, pkgs_to_install):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   200
                """Determine the fmri changes needed to install the specified pkgs"""
1832
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   201
                self.__plan_op(self.PLANNED_INSTALL)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   202
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   203
                # get ranking of publishers
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   204
                pub_ranks = self.image.get_publisher_ranks()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   205
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   206
                # build installed dict
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   207
                installed_dict = ImagePlan.__fmris2dict(self.image.gen_installed_pkgs())
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   208
                
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   209
                # build installed publisher dictionary
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   210
                installed_pubs = dict((
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   211
                                (f.pkg_name, f.get_publisher()) 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   212
                                for f in installed_dict.values()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   213
                                ))
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   214
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   215
                proposed_dict, self.__references = self.match_user_fmris(pkgs_to_install, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   216
                    True, pub_ranks, installed_pubs)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   217
                
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   218
                # instantiate solver
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   219
                self.__pkg_solver = pkg_solver.PkgSolver(
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   220
                    self.image.get_catalog(self.image.IMG_CATALOG_KNOWN),
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   221
                    installed_dict, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   222
                    pub_ranks,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   223
                    self.image.get_variants(),
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   224
                    self.__progtrack)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   225
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   226
                # Solve... will raise exceptions if no solution is found 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   227
                new_vector = self.__pkg_solver.solve_install([], proposed_dict, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   228
                    self.__new_excludes)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   229
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   230
                self.__fmri_changes = [ 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   231
                        (a, b)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   232
                        for a, b in ImagePlan.__dicts2fmrichanges(installed_dict, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   233
                            ImagePlan.__fmris2dict(new_vector))
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   234
                        if a != b
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   235
                        ]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   236
 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   237
                self.state = EVALUATED_PKGS
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   238
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   239
        def plan_uninstall(self, pkgs_to_uninstall, recursive_removal=False):
1832
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   240
                self.__plan_op(self.PLANNED_UNINSTALL)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   241
                proposed_dict, self.__references = self.match_user_fmris(pkgs_to_uninstall, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   242
                    False, None, None)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   243
                # merge patterns together
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   244
                proposed_removals = set([
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   245
                                f 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   246
                                for each in proposed_dict.values()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   247
                                for f in each
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   248
                                ])
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   249
1762
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   250
                # build installed dict
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   251
                installed_dict = dict([
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   252
                        (f.pkg_name, f)
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   253
                        for f in self.image.gen_installed_pkgs()
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   254
                        ])
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   255
                                
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   256
                # instantiate solver
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   257
                self.__pkg_solver = pkg_solver.PkgSolver(
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   258
                    self.image.get_catalog(self.image.IMG_CATALOG_KNOWN),
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   259
                    installed_dict, 
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   260
                    self.image.get_publisher_ranks(),
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   261
                    self.image.get_variants(),
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   262
                    self.__progtrack)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   263
1762
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   264
                new_vector = self.__pkg_solver.solve_uninstall([], 
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   265
                    proposed_removals, recursive_removal, self.__new_excludes)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   266
1762
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   267
                self.__fmri_changes = [ 
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   268
                        (a, b)
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   269
                        for a, b in ImagePlan.__dicts2fmrichanges(installed_dict, 
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   270
                            ImagePlan.__fmris2dict(new_vector))
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   271
                        if a != b
2ae663f0e049 14507 renamed packages should be removed if possible
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1755
diff changeset
   272
                        ]
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   273
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   274
                self.state = EVALUATED_PKGS
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   275
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   276
        @staticmethod
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   277
        def __fmris2dict(fmri_list):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   278
                return  dict([
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   279
                        (f.pkg_name, f)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   280
                        for f in fmri_list
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   281
                        ])
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   282
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   283
        @staticmethod
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   284
        def __dicts2fmrichanges(olddict, newdict):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   285
                return [
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   286
                        (olddict.get(k, None), newdict.get(k, None))
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   287
                        for k in set(olddict.keys() + newdict.keys())
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   288
                        ]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   289
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   290
        def plan_update(self):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   291
                """Determine the fmri changes needed to update all
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   292
                pkgs"""
1832
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   293
                self.__plan_op(self.PLANNED_UPDATE)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   294
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   295
                # build installed dict
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   296
                installed_dict = dict([
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   297
                        (f.pkg_name, f)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   298
                        for f in self.image.gen_installed_pkgs()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   299
                        ])
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   300
                                
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   301
                # instantiate solver
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   302
                self.__pkg_solver = pkg_solver.PkgSolver(
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   303
                    self.image.get_catalog(self.image.IMG_CATALOG_KNOWN),
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   304
                    installed_dict, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   305
                    self.image.get_publisher_ranks(),
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   306
                    self.image.get_variants(),
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   307
                    self.__progtrack)
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   308
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   309
                new_vector = self.__pkg_solver.solve_update([],  self.__new_excludes)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   310
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   311
                self.__fmri_changes = [ 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   312
                        (a, b)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   313
                        for a, b in ImagePlan.__dicts2fmrichanges(installed_dict, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   314
                            ImagePlan.__fmris2dict(new_vector))
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   315
                        if a != b
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   316
                        ]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   317
              
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   318
                self.state = EVALUATED_PKGS
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   319
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1231
diff changeset
   320
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   321
        def plan_fix(self, pkgs_to_fix):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   322
                """Create the list of pkgs to fix"""
1832
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   323
                self.__plan_op(self.PLANNED_FIX)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   324
                # XXX complete this
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   325
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   326
        def plan_change_varcets(self, variants, facets):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   327
                """Determine the fmri changes needed to change
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   328
                the specified variants/facets"""
1832
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   329
                self.__plan_op(self.PLANNED_VARIANT)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   330
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   331
                if variants == None and facets == None: # nothing to do
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   332
                        self.state = EVALUATED_PKGS
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   333
                        return
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   334
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   335
                self.__variant_change = True
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   336
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   337
                # build installed dict
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   338
                installed_dict = dict([
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   339
                        (f.pkg_name, f)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   340
                        for f in self.image.gen_installed_pkgs()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   341
                        ])
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   342
                                
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   343
                # instantiate solver
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   344
                self.__pkg_solver = pkg_solver.PkgSolver(
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   345
                    self.image.get_catalog(self.image.IMG_CATALOG_KNOWN),
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   346
                    installed_dict, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   347
                    self.image.get_publisher_ranks(),
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   348
                    self.image.get_variants(),
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   349
                    self.__progtrack)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   350
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   351
                self.__new_excludes = self.image.list_excludes(variants, facets)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   352
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   353
                new_vector = self.__pkg_solver.solve_change_varcets([],
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   354
                    variants, facets, self.__new_excludes)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   355
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   356
                self.__new_variants = variants
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   357
                self.__new_facets   = facets
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   358
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   359
                self.__fmri_changes = [ 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   360
                        (a, b)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   361
                        for a, b in ImagePlan.__dicts2fmrichanges(installed_dict, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   362
                            ImagePlan.__fmris2dict(new_vector))              
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   363
                        ]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   364
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   365
                self.state = EVALUATED_PKGS
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   366
                return
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   367
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   368
        def reboot_needed(self):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   369
                """Check if evaluated imageplan requires a reboot"""
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   370
                assert self.state >= EVALUATED_OK
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   371
                return self.__actuators.reboot_needed()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   372
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   373
539
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   374
        def get_plan(self, full=True):
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   375
                if full:
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   376
                        return str(self)
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   377
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   378
                output = ""
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   379
                
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   380
                for t in self.__fmri_changes:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   381
                        output += "%s -> %s\n" % t
539
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   382
                return output
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   383
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   384
        def display(self):
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   385
                if DebugValues["plan"]:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   386
                        logger.info(self.__verbose_str())
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   387
                else:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   388
                        logger.info(str(self))
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   389
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   390
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   391
        def gen_new_installed_pkgs(self):
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 717
diff changeset
   392
                """ generates all the fmris in the new set of installed pkgs"""
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   393
                assert self.state >= EVALUATED_PKGS
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   394
                fmri_set = set(self.image.gen_installed_pkgs())
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   395
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   396
                for p in self.pkg_plans:
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   397
                        p.update_pkg_set(fmri_set)
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   398
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   399
                for pfmri in fmri_set:
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   400
                        yield pfmri
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   401
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   402
        def gen_new_installed_actions(self):
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   403
                """generates actions in new installed image"""
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   404
                assert self.state >= EVALUATED_PKGS
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   405
                for pfmri in self.gen_new_installed_pkgs():
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   406
                        m = self.image.get_manifest(pfmri)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   407
                        for act in m.gen_actions(self.__new_excludes):
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   408
                                yield act
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   409
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   410
        def gen_new_installed_actions_bytype(self, atype):
567
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   411
                """generates actions in new installed image"""
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   412
                assert self.state >= EVALUATED_PKGS
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   413
                for pfmri in self.gen_new_installed_pkgs():
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   414
                        m = self.image.get_manifest(pfmri)
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   415
                        for act in m.gen_actions_by_type(atype,
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   416
                            self.__new_excludes):
567
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   417
                                yield act
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   418
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   419
        def get_directories(self):
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   420
                """ return set of all directories in target image """
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   421
                # always consider var and var/pkg fixed in image....
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   422
                # XXX should be fixed for user images
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   423
                if self.__directories == None:
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1231
diff changeset
   424
                        dirs = set(["var",
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1231
diff changeset
   425
                                    "var/pkg",
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1231
diff changeset
   426
                                    "var/sadm",
956
adf6bdfdb3b5 6904 image.installed_file_authority always tries to open installed file r+
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 941
diff changeset
   427
                                    "var/sadm/install"])
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   428
                        for pfmri in self.gen_new_installed_pkgs():
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   429
                                m = self.image.get_manifest(pfmri)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   430
                                for d in m.get_directories(self.__new_excludes):
956
adf6bdfdb3b5 6904 image.installed_file_authority always tries to open installed file r+
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 941
diff changeset
   431
                                        dirs.add(os.path.normpath(d))
adf6bdfdb3b5 6904 image.installed_file_authority always tries to open installed file r+
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 941
diff changeset
   432
                        self.__directories = dirs
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   433
                return self.__directories
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   434
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   435
        def __get_symlinks(self):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   436
                """ return a set of all symlinks in target image"""
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   437
                if self.__symlinks == None:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   438
                        self.__symlinks = set((
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   439
                                        a.attrs["path"]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   440
                                        for a in self.gen_new_installed_actions_bytype("link")
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   441
                                        ))
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   442
                return self.__symlinks
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   443
1924
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   444
        def __get_hardlinks(self):
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   445
                """ return a set of all hardlinks in target image"""
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   446
                if self.__hardlinks == None:
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   447
                        self.__hardlinks = set((
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   448
                                        a.attrs["path"]
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   449
                                        for a in self.gen_new_installed_actions_bytype("hardlink")
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   450
                                        ))
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   451
                return self.__hardlinks
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   452
1693
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   453
        @staticmethod
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   454
        def default_keyfunc(name, act):
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   455
                """This is the default function used by get_actions when
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   456
                the caller provides no key."""
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   457
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   458
                attr_name = pkg.actions.types[name].key_attr
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   459
                return act.attrs[attr_name]
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   460
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   461
        @staticmethod
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   462
        def hardlink_keyfunc(name, act):
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   463
                """Keyfunc used in evaluate when calling get_actions
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   464
                for hardlinks."""
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   465
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   466
                return act.get_target_path()
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   467
1306
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   468
        def get_actions(self, name, key=None):
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   469
                """Return a dictionary of actions of the type given by 'name'
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   470
                describing the target image.  If 'key' is given and not None,
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   471
                the dictionary's key will be the name of the action type's key
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   472
                attribute.  Otherwise, it's a callable taking an action as an
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   473
                argument which returns the key.  This dictionary is cached for
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   474
                quick future lookups."""
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   475
                if key is None:
1693
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   476
                        key = self.default_keyfunc
1306
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   477
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   478
                if (name, key) in self.__cached_actions:
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   479
                        return self.__cached_actions[(name, key)]
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   480
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   481
                d = {}
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   482
                for act in self.gen_new_installed_actions_bytype(name):
1693
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   483
                        t = key(name, act)
1306
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   484
                        d.setdefault(t, []).append(act)
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   485
                self.__cached_actions[(name, key)] = d
9a02ddf28dea 10630 driver action gets confused by driver_aliases entries not covered by an action
Danek Duvall <danek.duvall@sun.com>
parents: 1288
diff changeset
   486
                return self.__cached_actions[(name, key)]
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   487
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   488
        def __get_manifest(self, pfmri, intent, all_variants=False):
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   489
                """Return manifest for pfmri"""
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   490
                if pfmri:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   491
                        return self.image.get_manifest(pfmri, 
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   492
                            all_variants=all_variants or self.__variant_change,
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   493
                            intent=intent)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   494
                else:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   495
                        return manifest.NullCachedManifest
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 717
diff changeset
   496
1694
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   497
        def __create_intent(self, old_fmri, new_fmri, enabled_publishers):
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   498
                """Return intent strings (or None).  Given a pair
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   499
                of fmris describing a package operation, this
1694
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   500
                routine returns intent strings to be passed to
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   501
                originating publisher describing manifest
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   502
                operations.  We never send publisher info to
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   503
                prevent cross-publisher leakage of info."""
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   504
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   505
                if self.__noexecute:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   506
                        return None, None
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   507
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   508
                if new_fmri:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   509
                        reference = self.__references.get(new_fmri, None)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   510
                        # don't leak prev. version info across publishers
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   511
                        if old_fmri:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   512
                                if old_fmri.get_publisher() != \
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   513
                                    new_fmri.get_publisher():
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   514
                                        old_fmri = "unknown"
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   515
                                else:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   516
                                        old_fmri = old_fmri.get_fmri(anarchy=True)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   517
                        new_fmri = new_fmri.get_fmri(anarchy=True)# don't send pub
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   518
                else:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   519
                        reference = self.__references.get(old_fmri, None)
1694
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   520
                        # don't try to send intent info to disabled publisher
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   521
                        if old_fmri.get_publisher() in enabled_publishers:
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   522
                                old_fmri = old_fmri.get_fmri(anarchy=True)# don't send pub
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   523
                        else:
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   524
                                old_fmri = None
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   525
                info = {
1832
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1784
diff changeset
   526
                    "operation": self._planned_op,
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   527
                    "old_fmri" : old_fmri,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   528
                    "new_fmri" : new_fmri,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   529
                    "reference": reference
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   530
                }
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   531
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   532
                s = "(%s)" % ";".join([
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   533
                    "%s=%s" % (key, info[key]) for key in info
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   534
                    if info[key] is not None
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   535
                ])
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   536
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   537
                if new_fmri:
1694
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   538
                        return None, s    # only report new on upgrade
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   539
                elif old_fmri:
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   540
                        return s, None    # uninstall w/ enabled pub
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   541
                else:
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   542
                        return None, None # uninstall w/ disabled pub
1521
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   543
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   544
        def add_actuator(self, phase, name, value):
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   545
                """Add an actuator to the plan.
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   546
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   547
                The actuator name ('reboot-needed', 'restart_fmri', etc.) is
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   548
                given in 'name', and the fmri string or callable is given in
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   549
                'value'.  The 'phase' parameter must be one of 'install',
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   550
                'remove', or 'update'.
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   551
                """
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   552
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   553
                if phase == "install":
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   554
                        d = self.__actuators.install
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   555
                elif phase == "remove":
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   556
                        d = self.__actuators.removal
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   557
                elif phase == "update":
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   558
                        d = self.__actuators.update
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   559
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   560
                if callable(value):
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   561
                        d[name] = value
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   562
                else:
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   563
                        d.setdefault(name, []).append(value)
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   564
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   565
        def evaluate(self, verbose=False):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   566
                """Given already determined fmri changes, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   567
                build pkg plans and figure out exact impact of
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   568
                proposed changes"""
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   569
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   570
                assert self.state == EVALUATED_PKGS, self
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   571
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   572
                if self._image_lm != self.image.get_last_modified():
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   573
                        # State has been modified since plan was created; this
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   574
                        # plan is no longer valid.
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   575
                        raise api_errors.InvalidPlanError()
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   576
1521
946bd128177d 8647 devices not usable immediately after install
Danek Duvall <danek.duvall@sun.com>
parents: 1516
diff changeset
   577
                # prefetch manifests
1618
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
   578
                prefetch_mfsts = [] # manifest, intents to be prefetched
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   579
                eval_list = []     # oldfmri, oldintent, newfmri, newintent
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   580
                                   # prefetched intents omitted
1694
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   581
                enabled_publishers = set([
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   582
                                a.prefix
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   583
                                for a in self.image.gen_publishers()
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   584
                                ])
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   585
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   586
                for oldfmri, newfmri in self.__fmri_changes:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   587
                        self.__progtrack.evaluate_progress(oldfmri)
1694
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   588
                        old_in, new_in = self.__create_intent(oldfmri, newfmri,
ce69ab869838 13248 client should not send intent for disabled publishers
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1693
diff changeset
   589
                            enabled_publishers)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   590
                        if oldfmri:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   591
                                if not self.image.has_manifest(oldfmri):
1618
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
   592
                                        prefetch_mfsts.append((oldfmri, old_in))
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   593
                                        old_in = None # so we don't send it twice
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   594
                        if newfmri:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   595
                                if not self.image.has_manifest(newfmri):
1618
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
   596
                                        prefetch_mfsts.append((newfmri, new_in))
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   597
                                        new_in = None
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   598
                        eval_list.append((oldfmri, old_in, newfmri, new_in))
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   599
                        old_in = new_in = None
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   600
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   601
                # No longer needed.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   602
                del enabled_publishers
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   603
                self.__references = None
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   604
1618
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
   605
                self.image.transport.prefetch_manifests(prefetch_mfsts, 
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   606
                    progtrack=self.__progtrack,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   607
                    ccancel=self.__check_cancelation)
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   608
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   609
                # No longer needed.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   610
                del prefetch_mfsts
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   611
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   612
                for oldfmri, old_in, newfmri, new_in in eval_list:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   613
                        pp = pkgplan.PkgPlan(self.image, self.__progtrack,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   614
                            self.__check_cancelation)
235
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 195
diff changeset
   615
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   616
                        pp.propose(oldfmri,
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   617
                            self.__get_manifest(oldfmri, old_in),
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   618
                            newfmri, self.__get_manifest(newfmri, new_in,
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   619
                            all_variants=True))
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   620
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   621
                        pp.evaluate(self.__old_excludes, self.__new_excludes)
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   622
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   623
                        if pp.origin_fmri and pp.destination_fmri:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   624
                                self.__target_update_count += 1
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   625
                        elif pp.destination_fmri:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   626
                                self.__target_install_count += 1
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   627
                        elif pp.origin_fmri:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   628
                                self.__target_removal_count += 1
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   629
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   630
                        self.pkg_plans.append(pp)
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   631
                        pp = None
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   632
                        self.__progtrack.evaluate_progress()
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   633
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   634
                # No longer needed.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   635
                del eval_list
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   636
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   637
                # we now have a workable set of pkgplans to add/upgrade/remove
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   638
                # now combine all actions together to create a synthetic single
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   639
                # step upgrade operation, and handle editable files moving from
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   640
                # package to package.  See theory comment in execute, below.
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   641
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   642
                ActionPlan = namedtuple("ActionPlan", "p src dst")
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   643
1784
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   644
                self.removal_actions = []
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   645
                for p in self.pkg_plans:
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   646
                        for src, dest in p.gen_removal_actions():
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   647
                                if src.name == "user":
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   648
                                        self.removed_users[src.attrs["username"]] = \
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   649
                                            p.origin_fmri
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   650
                                elif src.name == "group":
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   651
                                        self.removed_groups[src.attrs["groupname"]] = \
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   652
                                            p.origin_fmri
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   653
                                self.removal_actions.append(ActionPlan(p, src,
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   654
                                    dest))
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   655
                self.__progtrack.evaluate_progress()
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   656
1784
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   657
                self.update_actions = []
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   658
                for p in self.pkg_plans:
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   659
                        for src, dest in p.gen_update_actions():
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   660
                                if dest.name == "user":
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   661
                                        self.added_users[dest.attrs["username"]] = \
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   662
                                            p.destination_fmri
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   663
                                elif dest.name == "group":
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   664
                                        self.added_groups[dest.attrs["groupname"]] = \
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   665
                                            p.destination_fmri
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   666
                                self.update_actions.append(ActionPlan(p, src,
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   667
                                    dest))
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   668
                self.__progtrack.evaluate_progress()
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   669
1784
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   670
                self.install_actions = []
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   671
                for p in self.pkg_plans:
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   672
                        for src, dest in p.gen_install_actions():
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   673
                                if dest.name == "user":
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   674
                                        self.added_users[dest.attrs["username"]] = \
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   675
                                            p.destination_fmri
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   676
                                elif dest.name == "group":
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   677
                                        self.added_groups[dest.attrs["groupname"]] = \
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   678
                                            p.destination_fmri
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   679
                                self.install_actions.append(ActionPlan(p, src,
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   680
                                    dest))
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   681
                self.__progtrack.evaluate_progress()
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   682
1784
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   683
                # In case a removed user or group was added back...
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   684
                for entry in self.added_groups.keys():
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   685
                        if entry in self.removed_groups:
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   686
                                del self.removed_groups[entry]
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   687
                for entry in self.added_users.keys():
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   688
                        if entry in self.removed_users:
e69b4aa1a6b5 791 stack trace when installing directory or file with missing mandatory attributes
Shawn Walker <srw@sun.com>
parents: 1762
diff changeset
   689
                                del self.removed_users[entry]
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   690
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   691
                self.__actuators = actuator.Actuator()
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   692
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   693
                ConsolidationEntry = namedtuple("ConsolidationEntry", "idx id")
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   694
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   695
                # cons_named maps original_name tags to the index into
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   696
                # removal_actions so we can retrieve them later.  cons_generic
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   697
                # maps the (action.name, action.key-attribute-value) tuple to
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   698
                # the same thing.  The reason for both is that cons_named allows
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   699
                # us to deal with files which change their path as well as their
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   700
                # package, while cons_generic doesn't require the "receiving"
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   701
                # package to have marked the file in any special way, plus
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   702
                # obviously it handles all actions even if they don't have
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   703
                # paths.
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   704
                cons_named = {}
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   705
                cons_generic = {}
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   706
                for i, ap in enumerate(self.removal_actions):
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   707
                        self.__progtrack.evaluate_progress()
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   708
                        # remove dir removals if dir is still in final image
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   709
                        if ap.src.name == "dir" and \
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   710
                            os.path.normpath(ap.src.attrs["path"]) in \
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   711
                            self.get_directories():
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   712
                                self.removal_actions[i] = None
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   713
                                continue
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   714
                        # remove link removal if link is still in final image
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   715
                        # (implement reference count on removal due to borked pkgs)
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   716
                        if ap.src.name == "link" and \
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   717
                            os.path.normpath(ap.src.attrs["path"]) in \
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   718
                            self.__get_symlinks():
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   719
                                self.removal_actions[i] = None
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   720
                                continue
1924
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   721
                        # discard hardlink removal if hardlink is still in final
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   722
                        # image.
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   723
                        if ap.src.name == "hardlink" and \
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   724
                            os.path.normpath(ap.src.attrs["path"]) in \
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   725
                            self.__get_hardlinks():
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   726
                                self.removal_actions[i] = None
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   727
                                continue
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   728
                       
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   729
                        # store names of files being removed under own name
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   730
                        # or original name if specified
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   731
                        if ap.src.globally_unique:
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   732
                                attrs = ap.src.attrs
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   733
                                # Store the index into removal_actions and the
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   734
                                # id of the action object in that slot.
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   735
                                re = ConsolidationEntry(i, id(ap.src))
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   736
                                cons_generic[(ap.src.name, attrs[ap.src.key_attr])] = re
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   737
                                if ap.src.name == "file":
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   738
                                        fname = attrs.get("original_name",
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   739
                                            "%s:%s" % (ap.p.origin_fmri.get_name(),
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   740
                                            attrs["path"]))
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   741
                                        cons_named[fname] = re
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   742
                                        fname = None
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   743
                                attrs = re = None
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   744
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   745
                        self.__actuators.scan_removal(ap.src.attrs)
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   746
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   747
                self.__progtrack.evaluate_progress()
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   748
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   749
                # Construct a mapping from the install actions in a pkgplan to
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   750
                # the position they have in the plan's list.  This allows us to
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   751
                # remove them efficiently later, if they've been consolidated.
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   752
                #
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   753
                # NOTE: This means that the action ordering in the package plans
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   754
                # must remain fixed, at least for the duration of the imageplan
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   755
                # evaluation.
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   756
                plan_pos = {}
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   757
                for p in self.pkg_plans:
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   758
                        for i, a in enumerate(p.gen_install_actions()):
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   759
                                plan_pos[id(a[1])] = i
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   760
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   761
                # This keeps track of which pkgplans have had install actions
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   762
                # consolidated away.
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   763
                pp_needs_trimming = []
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   764
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   765
                # This maps destination actions to the pkgplans they're
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   766
                # associated with, which allows us to create the newly
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   767
                # discovered update ActionPlans.
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   768
                dest_pkgplans = {}
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   769
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   770
                new_updates = []
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   771
                for i, ap in enumerate(self.install_actions):
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   772
                        self.__progtrack.evaluate_progress()
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   773
                        # In order to handle editable files that move their path
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   774
                        # or change pkgs, for all new files with original_name
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   775
                        # attribute, make sure file isn't being removed by
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   776
                        # checking removal list.  If it is, tag removal to save
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   777
                        # file, and install to recover cached version... caching
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   778
                        # is needed if directories are removed or don't exist
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   779
                        # yet.
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   780
                        if (ap.dst.name == "file" and
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   781
                            "original_name" in ap.dst.attrs and
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   782
                            ap.dst.attrs["original_name"] in cons_named):
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   783
                                cache_name = ap.dst.attrs["original_name"]
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   784
                                index = cons_named[cache_name].idx
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   785
                                ra = self.removal_actions[index].src
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   786
                                assert(id(ra) == cons_named[cache_name].id)
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   787
                                # If the paths match, don't remove and add;
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   788
                                # convert to update.
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   789
                                if ap.dst.attrs["path"] == ra.attrs["path"]:
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   790
                                        new_updates.append((ra, ap.dst))
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   791
                                        # If we delete items here, the indices
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   792
                                        # in cons_named will be bogus, so mark
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   793
                                        # them for later deletion.
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   794
                                        self.removal_actions[index] = None
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   795
                                        self.install_actions[i] = None
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   796
                                        # No need to handle it in cons_generic
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   797
                                        # anymore
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   798
                                        del cons_generic[("file", ra.attrs["path"])]
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   799
                                        dest_pkgplans[id(ap.dst)] = ap.p
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   800
                                else:
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   801
                                        ra.attrs["save_file"] = cache_name
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   802
                                        ap.dst.attrs["save_file"] = cache_name
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   803
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   804
                                cache_name = index = ra = None
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   805
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   806
                        # Similarly, try to prevent files (and other actions)
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   807
                        # from unnecessarily being deleted and re-created if
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   808
                        # they're simply moving between packages, but only if
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   809
                        # they keep their paths (or key-attribute values).
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   810
                        keyval = ap.dst.attrs.get(ap.dst.key_attr, None)
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   811
                        if (ap.dst.name, keyval) in cons_generic:
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   812
                                nkv = ap.dst.name, keyval
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   813
                                index = cons_generic[nkv].idx
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   814
                                ra = self.removal_actions[index].src
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   815
                                assert(id(ra) == cons_generic[nkv].id)
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   816
                                if keyval == ra.attrs[ra.key_attr]:
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   817
                                        new_updates.append((ra, ap.dst))
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   818
                                        self.removal_actions[index] = None
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   819
                                        self.install_actions[i] = None
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   820
                                        dest_pkgplans[id(ap.dst)] = ap.p
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   821
                                        # Add the action to the pkgplan's update
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   822
                                        # list and mark it for removal from the
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   823
                                        # install list.
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   824
                                        ap.p.actions.changed.append((ra, ap.dst))
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   825
                                        ap.p.actions.added[plan_pos[id(ap.dst)]] = None
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   826
                                        pp_needs_trimming.append(ap.p)
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   827
                                nkv = index = ra = None
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   828
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   829
                        self.__actuators.scan_install(ap.dst.attrs)
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   830
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   831
                del ConsolidationEntry, cons_generic, cons_named, plan_pos
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   832
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   833
                # Remove from the pkgplans the install actions which have been
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   834
                # consolidated away.
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   835
                for p in pp_needs_trimming:
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   836
                        # Can't modify the p.actions tuple, so modify the added
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   837
                        # member in-place.
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   838
                        p.actions.added[:] = [
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   839
                            a
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   840
                            for a in p.actions.added
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   841
                            if a is not None
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   842
                        ]
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   843
                del pp_needs_trimming
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   844
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   845
                # We want to cull out actions where they've not changed at all,
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   846
                # leaving only the changed ones to put into self.update_actions.
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   847
                nu_src = manifest.Manifest()
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   848
                nu_src.set_content((a[0] for a in new_updates),
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   849
                    excludes=self.__old_excludes)
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   850
                nu_dst = manifest.Manifest()
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   851
                self.__progtrack.evaluate_progress()
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   852
                nu_dst.set_content((a[1] for a in new_updates),
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   853
                    excludes=self.__new_excludes)
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   854
                del new_updates
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   855
                self.__progtrack.evaluate_progress()
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   856
                nu_add, nu_chg, nu_rem = nu_dst.difference(nu_src,
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   857
                    self.__old_excludes, self.__new_excludes)
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   858
                self.__progtrack.evaluate_progress()
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   859
                # All the differences should be updates
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   860
                assert not nu_add
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   861
                assert not nu_rem
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   862
                del nu_src, nu_dst
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   863
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   864
                # Extend update_actions with the new tuples.  The package plan
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   865
                # is the one associated with the action getting installed.
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   866
                self.update_actions.extend([
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   867
                    ActionPlan(dest_pkgplans[id(dst)], src, dst)
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   868
                    for src, dst in nu_chg
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   869
                ])
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   870
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   871
                del dest_pkgplans, nu_chg
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   872
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   873
                self.removal_actions = [
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   874
                    a
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   875
                    for a in self.removal_actions
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   876
                    if a is not None
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   877
                ]
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   878
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   879
                self.install_actions = [
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   880
                    a
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   881
                    for a in self.install_actions
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   882
                    if a is not None
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   883
                ]
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   884
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   885
                self.__progtrack.evaluate_progress()
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   886
                # Go over update actions
1693
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
   887
                l_actions = self.get_actions("hardlink", self.hardlink_keyfunc)
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   888
                l_refresh = []
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   889
                for a in self.update_actions:
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   890
                        # For any files being updated that are the target of
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   891
                        # _any_ hardlink actions, append the hardlink actions
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   892
                        # to the update list so that they are not broken.
1924
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   893
                        # Since we reference count hardlinks, update each one
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   894
                        # only once.
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   895
                        if a[2].name == "file":
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   896
                                path = a[2].attrs["path"]
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   897
                                if path in l_actions:
1924
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   898
                                        unique_links = dict((l.attrs["path"], l) 
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   899
                                            for l in l_actions[path])
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   900
                                        l_refresh.extend([
1713
79b3c456f189 13907 renaming SUNWcs causes renamed package delivering user to fail uninstall
Danek Duvall <danek.duvall@sun.com>
parents: 1710
diff changeset
   901
                                            ActionPlan(a[0], l, l)
1924
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
   902
                                            for l in unique_links.values()
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   903
                                        ])
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   904
                                path = None
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   905
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   906
                        # scan both old and new actions
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   907
                        # repairs may result in update action w/o orig action
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   908
                        if a[1]:
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   909
                                self.__actuators.scan_update(a[1].attrs)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   910
                        self.__actuators.scan_update(a[2].attrs)
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   911
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   912
                self.update_actions.extend(l_refresh)
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   913
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   914
                # sort actions to match needed processing order
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   915
                self.removal_actions.sort(key = lambda obj:obj[1], reverse=True)
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   916
                self.update_actions.sort(key = lambda obj:obj[2])
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   917
                self.install_actions.sort(key = lambda obj:obj[2])
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   918
1618
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
   919
                # Pre-calculate size of data retrieval for preexecute().
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
   920
                npkgs = nfiles = nbytes = 0
577
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   921
                for p in self.pkg_plans:
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   922
                        nf, nb = p.get_xferstats()
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   923
                        nbytes += nb
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   924
                        nfiles += nf
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   925
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   926
                        # It's not perfectly accurate but we count a download
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   927
                        # even if the package will do zero data transfer.  This
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   928
                        # makes the pkg stats consistent between download and
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   929
                        # install.
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   930
                        npkgs += 1
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   931
                self.__progtrack.download_set_goal(npkgs, nfiles, nbytes)
577
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   932
1618
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
   933
                # Evaluation complete.
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   934
                self.__progtrack.evaluate_done(self.__target_install_count, \
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   935
                    self.__target_update_count, self.__target_removal_count)
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   936
                self.state = EVALUATED_OK
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   937
329
f549eab0d7b7 735 install -n uninformative
Dan Price <dp@eng.sun.com>
parents: 316
diff changeset
   938
        def nothingtodo(self):
368
777fb019e807 1338 traceback when installing a package with a dependency that can not be satisfied
Brock Pytlik <bpytlik@sun.com>
parents: 329
diff changeset
   939
                """ Test whether this image plan contains any work to do """
329
f549eab0d7b7 735 install -n uninformative
Dan Price <dp@eng.sun.com>
parents: 316
diff changeset
   940
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   941
                # handle case w/ -n no verbose
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   942
                if self.state == EVALUATED_PKGS:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   943
                        return not self.__fmri_changes
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   944
                elif self.state >= EVALUATED_OK:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   945
                        return not self.pkg_plans
329
f549eab0d7b7 735 install -n uninformative
Dan Price <dp@eng.sun.com>
parents: 316
diff changeset
   946
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   947
        def preexecute(self):
237
6ece196588cb 348 files that move from pkg to pkg can cause problems during upgrade
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 235
diff changeset
   948
                """Invoke the evaluated image plan
6ece196588cb 348 files that move from pkg to pkg can cause problems during upgrade
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 235
diff changeset
   949
                preexecute, execute and postexecute
6ece196588cb 348 files that move from pkg to pkg can cause problems during upgrade
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 235
diff changeset
   950
                execute actions need to be sorted across packages
6ece196588cb 348 files that move from pkg to pkg can cause problems during upgrade
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 235
diff changeset
   951
                """
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
   952
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   953
                assert self.state == EVALUATED_OK
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   954
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   955
                if self._image_lm != self.image.get_last_modified():
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   956
                        # State has been modified since plan was created; this
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   957
                        # plan is no longer valid.
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   958
                        self.state = PREEXECUTED_ERROR
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   959
                        raise api_errors.InvalidPlanError()
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
   960
368
777fb019e807 1338 traceback when installing a package with a dependency that can not be satisfied
Brock Pytlik <bpytlik@sun.com>
parents: 329
diff changeset
   961
                if self.nothingtodo():
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   962
                        self.state = PREEXECUTED_OK
368
777fb019e807 1338 traceback when installing a package with a dependency that can not be satisfied
Brock Pytlik <bpytlik@sun.com>
parents: 329
diff changeset
   963
                        return
329
f549eab0d7b7 735 install -n uninformative
Dan Price <dp@eng.sun.com>
parents: 316
diff changeset
   964
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   965
                # Checks the index to make sure it exists and is
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   966
                # consistent. If it's inconsistent an exception is thrown.
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   967
                # If it's totally absent, it will index the existing packages
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   968
                # so that the incremental update that follows at the end of
516
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   969
                # the function will work correctly. It also repairs the index
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   970
                # for this BE so the user can boot into this BE and have a
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   971
                # correct index.
598
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
   972
                if self.update_index:
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
   973
                        ind = None
598
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
   974
                        try:
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
   975
                                self.image.update_index_dir()
941
e7bff46da54e 6175 search needs to be moved to version 1
Brock Pytlik <bpytlik@sun.com>
parents: 931
diff changeset
   976
                                ind = indexer.Indexer(self.image,
886
8f40fc0ee8f9 6712 search shouldn't index actions for other variants of an image
Brock Pytlik <bpytlik@sun.com>
parents: 838
diff changeset
   977
                                    self.image.get_manifest,
941
e7bff46da54e 6175 search needs to be moved to version 1
Brock Pytlik <bpytlik@sun.com>
parents: 931
diff changeset
   978
                                    self.image.get_manifest_path,
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   979
                                    progtrack=self.__progtrack,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   980
                                    excludes=self.__old_excludes)
1017
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
   981
                                if ind.check_index_existence():
941
e7bff46da54e 6175 search needs to be moved to version 1
Brock Pytlik <bpytlik@sun.com>
parents: 931
diff changeset
   982
                                        try:
e7bff46da54e 6175 search needs to be moved to version 1
Brock Pytlik <bpytlik@sun.com>
parents: 931
diff changeset
   983
                                                ind.check_index_has_exactly_fmris(
e7bff46da54e 6175 search needs to be moved to version 1
Brock Pytlik <bpytlik@sun.com>
parents: 931
diff changeset
   984
                                                        self.image.gen_installed_pkg_names())
1286
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
   985
                                        except se.IncorrectIndexFileHash, e:
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
   986
                                                self.__preexecuted_indexing_error = \
1286
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
   987
                                                    api_errors.WrapSuccessfulIndexingException(
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
   988
                                                        e,
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
   989
                                                        traceback.format_exc(),
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
   990
                                                        traceback.format_stack()
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
   991
                                                        )
941
e7bff46da54e 6175 search needs to be moved to version 1
Brock Pytlik <bpytlik@sun.com>
parents: 931
diff changeset
   992
                                                ind.rebuild_index_from_scratch(
1286
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
   993
                                                        self.image.\
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
   994
                                                            gen_installed_pkgs()
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
   995
                                                        )
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
   996
                        except se.IndexingException, e:
598
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
   997
                                # If there's a problem indexing, we want to
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
   998
                                # attempt to finish the installation anyway. If
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
   999
                                # there's a problem updating the index on the
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
  1000
                                # new image, that error needs to be
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
  1001
                                # communicated to the user.
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1002
                                self.__preexecuted_indexing_error = \
1286
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1003
                                    api_errors.WrapSuccessfulIndexingException(
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1004
                                        e, traceback.format_exc(),
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1005
                                        traceback.format_stack())
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  1006
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1007
                        # No longer needed.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1008
                        del ind
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1009
1448
ff6208d2ff22 10919 Perform downloads in smaller chunks
johansen <johansen@sun.com>
parents: 1431
diff changeset
  1010
                # Remove history about manifest/catalog transactions.  This
ff6208d2ff22 10919 Perform downloads in smaller chunks
johansen <johansen@sun.com>
parents: 1431
diff changeset
  1011
                # helps the stats engine by only considering the performance of
ff6208d2ff22 10919 Perform downloads in smaller chunks
johansen <johansen@sun.com>
parents: 1431
diff changeset
  1012
                # bulk downloads.
ff6208d2ff22 10919 Perform downloads in smaller chunks
johansen <johansen@sun.com>
parents: 1431
diff changeset
  1013
                self.image.transport.stats.reset()
1618
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1014
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1015
                lic_errors = []
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1016
                try:
1618
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1017
                        # Check for license acceptance issues first to avoid
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1018
                        # wasted time in the download phase and so failure
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1019
                        # can occur early.
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1020
                        for p in self.pkg_plans:
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1021
                                try:
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1022
                                        p.preexecute()
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1023
                                except api_errors.PkgLicenseErrors, e:
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1024
                                        # Accumulate all license errors.
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1025
                                        lic_errors.append(e)
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1026
                                except EnvironmentError, e:
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1027
                                        if e.errno == errno.EACCES:
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1028
                                                raise api_errors.PermissionsException(
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1029
                                                    e.filename)
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1030
                                        if e.errno == errno.EROFS:
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1031
                                                raise api_errors.ReadOnlyFileSystemException(
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1032
                                                    e.filename)
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1033
                                        raise
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1034
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1035
                        if lic_errors:
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1036
                                raise api_errors.PlanLicenseErrors(lic_errors)
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1521
diff changeset
  1037
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1038
                        try:
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1039
                                for p in self.pkg_plans:
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1040
                                        p.download()
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1041
                        except EnvironmentError, e:
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1042
                                if e.errno == errno.EACCES:
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1043
                                        raise api_errors.PermissionsException(
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1044
                                            e.filename)
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1369
diff changeset
  1045
                                if e.errno == errno.EROFS:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1369
diff changeset
  1046
                                        raise api_errors.ReadOnlyFileSystemException(
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1369
diff changeset
  1047
                                            e.filename)
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1048
                                raise
481
9fa0541013b3 2402 pkg unable to remove executable file that is in use on Windows
Tom Mueller <Tom.Mueller@sun.com>
parents: 472
diff changeset
  1049
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1050
                        self.__progtrack.download_done()
1634
915de177f257 13746 transport should close connections after download phase
johansen <johansen@sun.com>
parents: 1618
diff changeset
  1051
                        self.image.transport.shutdown()
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1052
                except:
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1053
                        self.state = PREEXECUTED_ERROR
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1054
                        raise
235
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 195
diff changeset
  1055
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1056
                self.state = PREEXECUTED_OK
235
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 195
diff changeset
  1057
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1058
        def execute(self):
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1059
                """Invoke the evaluated image plan
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1060
                preexecute, execute and postexecute
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1061
                execute actions need to be sorted across packages
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1062
                """
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
  1063
                assert self.state == PREEXECUTED_OK
235
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 195
diff changeset
  1064
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
  1065
                if self._image_lm != self.image.get_last_modified():
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
  1066
                        # State has been modified since plan was created; this
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
  1067
                        # plan is no longer valid.
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
  1068
                        self.state = EXECUTED_ERROR
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
  1069
                        raise api_errors.InvalidPlanError()
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1694
diff changeset
  1070
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
  1071
                #
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
  1072
                # what determines execution order?
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
  1073
                #
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
  1074
                # The following constraints are key in understanding imageplan
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
  1075
                # execution:
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
  1076
                #
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1077
                # 1) All non-directory actions (files, users, hardlinks,
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1078
                # symbolic links, etc.) must appear in only a single installed
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1079
                # package.
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
  1080
                #
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
  1081
                # 2) All installed packages must be consistent in their view of
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1082
                # action types; if /usr/openwin is a directory in one package,
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1083
                # it must be a directory in all packages, never a symbolic link;
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1084
                # this includes implicitly defined directories.
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1085
                #
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1086
                # A key goal in IPS is to be able to undergo an arbtrary
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1087
                # transformation in package contents in a single step.  Packages
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1088
                # must be able to exchange files, convert directories to
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1089
                # symbolic links, etc.; so long as the start and end states meet
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1090
                # the above two constraints IPS must be able to transition
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
  1091
                # between the states directly.  This leads to the following:
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1092
                #
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1093
                # 1) All actions must be ordered across packages; packages
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1094
                # cannot be updated one at a time.
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
  1095
                #
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1096
                #    This is readily apparent when one considers two packages
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1097
                #    exchanging files in their new versions; in each case the
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1098
                #    package now owning the file must be installed last, but it
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1099
                #    is not possible for each package to be installed before the
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1100
                #    other.  Clearly, all the removals must be done first,
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1101
                #    followed by the installs and updates.
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
  1102
                #
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1103
                # 2) Installs of new actions must preceed updates of existing
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1104
                # ones.
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1105
                #
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1106
                #    In order to accomodate changes of file ownership of
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1107
                #    existing files to a newly created user, it is necessary
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1108
                #    for the installation of that user to preceed the update of
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1109
                #    files to reflect their new ownership.
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
  1110
                #
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1111
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1112
                if self.nothingtodo():
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1113
                        self.state = EXECUTED_OK
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1114
                        return
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
  1115
1017
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1116
                # It's necessary to do this check here because the state of the
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1117
                # image before the current operation is performed is desired.
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1118
                empty_image = self.__is_image_empty()
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1231
diff changeset
  1119
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1120
                self.__actuators.exec_prep(self.image)
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
  1121
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1122
                self.__actuators.exec_pre_actuators(self.image)
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
  1123
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1124
                # List of tuples of (src, dest) used to track each pkgplan so
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1125
                # that it can be discarded after execution.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1126
                executed_pp = []
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
  1127
                try:
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1128
                        try:
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1129
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1130
                                # execute removals
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1131
                                self.__progtrack.actions_set_goal(
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1231
diff changeset
  1132
                                    _("Removal Phase"),
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1133
                                    len(self.removal_actions))
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1134
                                for p, src, dest in self.removal_actions:
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1135
                                        p.execute_removal(src, dest)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1136
                                        self.__progtrack.actions_add_progress()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1137
                                self.__progtrack.actions_done()
237
6ece196588cb 348 files that move from pkg to pkg can cause problems during upgrade
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 235
diff changeset
  1138
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1139
                                # Done with removals; discard them so memory can
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1140
                                # be re-used.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1141
                                self.removal_actions = []
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1142
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1143
                                # execute installs
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1144
                                self.__progtrack.actions_set_goal(
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1231
diff changeset
  1145
                                    _("Install Phase"),
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1146
                                    len(self.install_actions))
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
  1147
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1148
                                for p, src, dest in self.install_actions:
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1149
                                        p.execute_install(src, dest)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1150
                                        self.__progtrack.actions_add_progress()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1151
                                self.__progtrack.actions_done()
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
  1152
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1153
                                # Done with installs, so discard them so memory
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1154
                                # can be re-used.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1155
                                self.install_actions = []
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1156
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1157
                                # execute updates
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1158
                                self.__progtrack.actions_set_goal(
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1231
diff changeset
  1159
                                    _("Update Phase"),
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1160
                                    len(self.update_actions))
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  1161
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1162
                                for p, src, dest in self.update_actions:
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1163
                                        p.execute_update(src, dest)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1164
                                        self.__progtrack.actions_add_progress()
237
6ece196588cb 348 files that move from pkg to pkg can cause problems during upgrade
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 235
diff changeset
  1165
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1166
                                self.__progtrack.actions_done()
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
  1167
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1168
                                # Done with updates, so discard them so memory
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1169
                                # can be re-used.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1170
                                self.update_actions = []
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1171
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1172
                                # handle any postexecute operations
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1173
                                while self.pkg_plans:
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1174
                                        # postexecute in reverse, but pkg_plans
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1175
                                        # aren't ordered, so does it matter?
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1176
                                        # This allows the pkgplan objects to be
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1177
                                        # discarded as they're executed which
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1178
                                        # allows memory to be-reused sooner.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1179
                                        p = self.pkg_plans.pop()
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1180
                                        p.postexecute()
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1181
                                        executed_pp.append((p.destination_fmri,
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1182
                                            p.origin_fmri))
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1183
                                        p = None
237
6ece196588cb 348 files that move from pkg to pkg can cause problems during upgrade
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 235
diff changeset
  1184
1358
6fec8fbc15a6 11324 package state written to parent boot environment during image-update
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
  1185
                                # save package state
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1186
                                self.image.update_pkg_installed_state(
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1187
                                    executed_pp)
1358
6fec8fbc15a6 11324 package state written to parent boot environment during image-update
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
  1188
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1231
diff changeset
  1189
                                # write out variant changes to the image config
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1190
                                if self.__variant_change:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1191
                                        self.image.image_config_update(
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1192
                                            self.__new_variants,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1193
                                            self.__new_facets)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1194
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1195
                        except EnvironmentError, e:
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1196
                                if e.errno == errno.EACCES or \
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1197
                                    e.errno == errno.EPERM:
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1198
                                        raise api_errors.PermissionsException(
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1199
                                            e.filename)
1335
3dde2385d05c 516 Clean up traceback for installs to read-only filesystems
John Sonnenschein <John.Sonnenschein@Sun.COM>
parents: 1306
diff changeset
  1200
                                elif e.errno == errno.EROFS:
1755
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1201
                                        raise api_errors.ReadOnlyFileSystemException(
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1202
                                            e.filename)
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 690
diff changeset
  1203
                                raise
1755
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1204
                except pkg.actions.ActionError:
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1205
                        exc_type, exc_value, exc_tb = sys.exc_info()
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1206
                        self.state = EXECUTED_ERROR
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1207
                        try:
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1208
                                self.__actuators.exec_fail_actuators(self.image)
1859
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  1209
                        except:
1755
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1210
                                # Ensure the real cause of failure is raised.
1859
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  1211
                                pass
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  1212
                        raise api_errors.InvalidPackageErrors([
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  1213
                            exc_value]), None, exc_tb
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
  1214
                except:
1755
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1215
                        exc_type, exc_value, exc_tb = sys.exc_info()
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1216
                        self.state = EXECUTED_ERROR
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1217
                        try:
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1218
                                self.__actuators.exec_fail_actuators(self.image)
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1219
                        finally:
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1220
                                # This ensures that the original exception and
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1221
                                # traceback are used if exec_fail_actuators
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1222
                                # fails.
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1713
diff changeset
  1223
                                raise exc_value, None, exc_tb
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
  1224
                else:
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1225
                        self.__actuators.exec_post_actuators(self.image)
516
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
  1226
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
  1227
                self.state = EXECUTED_OK
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1228
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
  1229
                # reduce memory consumption
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1230
                self.added_groups = {}
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1231
                self.removed_groups = {}
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1232
                self.added_users = {}
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1233
                self.removed_users = {}
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1234
                self.saved_files = {}
1859
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  1235
                self.valid_directories = set()
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1236
                self.__fmri_changes  = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1237
                self.__directories   = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1238
                self.__actuators     = []
1693
1d855833b718 3720 Race condition exists for cancelation using the API
johansen <johansen@sun.com>
parents: 1634
diff changeset
  1239
                self.__cached_actions = {}
1924
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
  1240
                self.__symlinks = None
ce58b6a5daa5 16066 hard links should be reference counted
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 1859
diff changeset
  1241
                self.__hardlinks = None
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 886
diff changeset
  1242
2003
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1924
diff changeset
  1243
                # Clear out the primordial user and group caches.
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1924
diff changeset
  1244
                self.image._users = set()
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1924
diff changeset
  1245
                self.image._groups = set()
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1924
diff changeset
  1246
                self.image._usersbyname = {}
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1924
diff changeset
  1247
                self.image._groupsbyname = {}
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1924
diff changeset
  1248
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  1249
                # Perform the incremental update to the search indexes
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  1250
                # for all changed packages
598
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
  1251
                if self.update_index:
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1252
                        self.__progtrack.actions_set_goal(_("Index Phase"),
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1253
                            len(executed_pp))
941
e7bff46da54e 6175 search needs to be moved to version 1
Brock Pytlik <bpytlik@sun.com>
parents: 931
diff changeset
  1254
                        self.image.update_index_dir()
e7bff46da54e 6175 search needs to be moved to version 1
Brock Pytlik <bpytlik@sun.com>
parents: 931
diff changeset
  1255
                        ind = indexer.Indexer(self.image,
e7bff46da54e 6175 search needs to be moved to version 1
Brock Pytlik <bpytlik@sun.com>
parents: 931
diff changeset
  1256
                            self.image.get_manifest,
e7bff46da54e 6175 search needs to be moved to version 1
Brock Pytlik <bpytlik@sun.com>
parents: 931
diff changeset
  1257
                            self.image.get_manifest_path,
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1258
                            progtrack=self.__progtrack,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1259
                            excludes=self.__new_excludes)
598
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
  1260
                        try:
1017
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1261
                                if empty_image:
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1262
                                        ind.setup()
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1263
                                if empty_image or ind.check_index_existence():
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1264
                                        ind.client_update_index(([],
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1265
                                            executed_pp), self.image)
1286
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1266
                        except KeyboardInterrupt:
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1267
                                raise
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1268
                        except se.ProblematicPermissionsIndexException:
1017
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1269
                                # ProblematicPermissionsIndexException
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1270
                                # is included here as there's little
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1271
                                # chance that trying again will fix this
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1272
                                # problem.
1286
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1273
                                raise api_errors.WrapIndexingException(e,
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1274
                                    traceback.format_exc(),
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1275
                                    traceback.format_stack())
598
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
  1276
                        except Exception, e:
1017
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1277
                                # It's important to delete and rebuild
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1278
                                # from scratch rather than using the
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1279
                                # existing indexer because otherwise the
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1280
                                # state will become confused.
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  1281
                                del ind
1017
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1282
                                # XXX Once we have a framework for
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1283
                                # emitting a message to the user in this
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1284
                                # spot in the code, we should tell them
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1285
                                # something has gone wrong so that we
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1286
                                # continue to get feedback to allow
598
c53f6107fdb6 2863 pkg install should have a way to disable indexing
Brock Pytlik <bpytlik@sun.com>
parents: 584
diff changeset
  1287
                                # us to debug the code.
1286
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1288
                                try:
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1289
                                        ind = indexer.Indexer(self.image,
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1290
                                            self.image.get_manifest,
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1291
                                            self.image.get_manifest_path,
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1292
                                            progtrack=self.__progtrack,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1293
                                            excludes=self.__new_excludes)
1286
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1294
                                        ind.rebuild_index_from_scratch(
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1295
                                            self.image.gen_installed_pkgs())
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1296
                                except Exception, e:
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1297
                                        raise api_errors.WrapIndexingException(
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1298
                                            e, traceback.format_exc(),
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1299
                                            traceback.format_stack())
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1300
                                raise \
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1301
                                    api_errors.WrapSuccessfulIndexingException(
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1302
                                        e, traceback.format_exc(),
2e5bb564a9e2 8948 search errors should make it clear that the rest of the command worked
Brock Pytlik <bpytlik@sun.com>
parents: 1271
diff changeset
  1303
                                        traceback.format_stack())
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1304
                        if self.__preexecuted_indexing_error is not None:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1305
                                raise self.__preexecuted_indexing_error
1017
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1306
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1307
        def __is_image_empty(self):
1017
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1308
                try:
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1309
                        self.image.gen_installed_pkg_names().next()
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1310
                        return False
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1311
                except StopIteration:
124cd379d3f6 7835 we must not rebuild the whole search index on first pkg install
Brock Pytlik <bpytlik@sun.com>
parents: 959
diff changeset
  1312
                        return True
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1313
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1314
        def match_user_fmris(self, patterns, all_known, pub_ranks, installed_pubs):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1315
                """Given a user-specified list of patterns, return a dictionary
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1316
                of matching fmris:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1317
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1318
                {pkgname: [fmri1, fmri2, ...]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1319
                 pkgname: [fmri1, fmri2, ...],
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1320
                 ...
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1321
                }
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1322
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1323
                Constraint used is always AUTO as per expected UI behavior.
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1324
                If all_known is true, matching is done against all known package,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1325
                otherwise just all installed pkgs.
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1326
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1327
                Note that patterns starting w/ pkg:/ require an exact match; patterns 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1328
                containing '*' will using fnmatch rules; the default trailing match 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1329
                rules are used for remaining patterns.
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1330
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1331
                Exactly duplicated patterns are ignored.
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1332
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1333
                Routine raises PlanCreationException if errors occur:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1334
                it is illegal to specify multiple different pattens that match
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1335
                the same pkg name.  Only patterns that contain wildcards are allowed
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1336
                to match multiple packages.
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1337
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1338
                Fmri lists are trimmed by publisher, either by pattern specification,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1339
                installed version or publisher ranking, in that order when all_known
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1340
                is True.
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1341
                """
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1342
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1343
                # problems we check for
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1344
                illegals      = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1345
                nonmatch      = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1346
                multimatch    = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1347
                not_installed = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1348
                multispec     = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1349
                wrongpub      = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1350
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1351
                matchers = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1352
                fmris    = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1353
                pubs     = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1354
                versions = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1355
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1356
                wildcard_patterns = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1357
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1358
                renamed_fmris = {}
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1359
                obsolete_fmris = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1360
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1361
                # ignore dups
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1362
                patterns = list(set(patterns))
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1363
                # print patterns, all_known, pub_ranks, installed_pubs
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1364
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1365
                # figure out which kind of matching rules to employ
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1366
                try:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1367
                        for pat in patterns:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1368
                                if "*" in pat or "?" in pat:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1369
                                        matcher = pkg.fmri.glob_match
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1370
                                        fmri = pkg.fmri.MatchingPkgFmri(
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1371
                                                                pat, "5.11")
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1372
                                        wildcard_patterns.append(pat)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1373
                                elif pat.startswith("pkg:/"):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1374
                                        matcher = pkg.fmri.exact_name_match
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1375
                                        fmri = pkg.fmri.PkgFmri(pat,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1376
                                                            "5.11")
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1377
                                else:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1378
                                        matcher = pkg.fmri.fmri_match
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1379
                                        fmri = pkg.fmri.PkgFmri(pat,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1380
                                                            "5.11")
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1381
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1382
                                matchers.append(matcher)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1383
                                pubs.append(fmri.get_publisher())
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1384
                                versions.append(fmri.version)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1385
                                fmris.append(fmri)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1386
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1387
                except pkg.fmri.IllegalFmri, e:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1388
                        illegals.append(e)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1389
                
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1390
                # Create a dictionary of patterns, with each value being
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1391
                # a dictionary of pkg names & fmris that match that pattern.
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1392
                ret = dict(zip(patterns, [dict() for i in patterns]))
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1393
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1394
                # keep track of publishers we reject due to implict selection of
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1395
                # installed publisher to produce better error message.
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1396
                rejected_pubs = {}
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1397
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1398
                if all_known:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1399
                        cat = self.image.get_catalog(self.image.IMG_CATALOG_KNOWN)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1400
                        info_needed = [pkg.catalog.Catalog.DEPENDENCY]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1401
                else:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1402
                        cat = self.image.get_catalog(self.image.IMG_CATALOG_INSTALLED)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1403
                        info_needed = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1404
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1405
                for name in cat.names():
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1406
                        for pat, matcher, fmri, version, pub in \
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1407
                            zip(patterns, matchers, fmris, versions, pubs):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1408
                                if not matcher(name, fmri.pkg_name):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1409
                                        continue # name doesn't match
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1410
                                for ver, entries in cat.entries_by_version(name, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1411
                                    info_needed=info_needed):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1412
                                        if version and not ver.is_successor(version,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1413
                                            pkg.version.CONSTRAINT_AUTO):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1414
                                                continue # version doesn't match
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1415
                                        for f, metadata in entries:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1416
                                                fpub = f.get_publisher()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1417
                                                if pub and pub != fpub:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1418
                                                        continue # specified pubs conflict
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1419
                                                elif not pub and all_known and \
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1420
                                                    name in installed_pubs and \
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1421
                                                    pub_ranks[installed_pubs[name]][1] \
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1422
                                                    == True and installed_pubs[name] != \
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1423
                                                    fpub:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1424
                                                        rejected_pubs.setdefault(pat, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1425
                                                            set()).add(fpub)                                                            
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1426
                                                        continue # installed sticky pub
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1427
                                                ret[pat].setdefault(f.pkg_name, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1428
                                                    []).append(f)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1429
                                                states = metadata["metadata"]["states"]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1430
                                                if self.image.PKG_STATE_OBSOLETE in states:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1431
                                                        obsolete_fmris.append(f)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1432
                                                if self.image.PKG_STATE_RENAMED in states and \
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1433
                                                    "actions" in metadata:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1434
                                                        renamed_fmris[f] = metadata["actions"]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1435
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1436
                # remove multiple matches if all versions are obsolete
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1437
                for p in patterns:                
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1438
                        if len(ret[p]) > 1 and p not in wildcard_patterns:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1439
                                # create dictionary of obsolete status vs pkg_name
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1440
                                obsolete = dict([                                        
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1441
                                        (pkg_name, reduce(operator.or_, 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1442
                                        [f in obsolete_fmris for f in ret[p][pkg_name]]))
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1443
                                        for pkg_name in ret[p]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1444
                                        ])
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1445
                                # remove all obsolete match if non-obsolete match also exists
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1446
                                if set([True, False]) == set(obsolete.values()):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1447
                                        for pkg_name in obsolete:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1448
                                                if obsolete[pkg_name]:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1449
                                                        del ret[p][pkg_name]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1450
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1451
                # remove newer multiple match if renamed version exists
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1452
                for p in patterns:                
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1453
                        if len(ret[p]) > 1 and p not in wildcard_patterns:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1454
                                targets = []
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1455
                                renamed_matches = (
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1456
                                    pfmri
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1457
                                    for pkg_name in ret[p]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1458
                                    for pfmri in ret[p][pkg_name]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1459
                                    if pfmri in renamed_fmris
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1460
                                    )
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1461
                                for f in renamed_matches:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1462
                                        for a in renamed_fmris[f]:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1463
                                                a = pkg.actions.fromstr(a)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1464
                                                if a.name != "depend":
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1465
                                                        continue
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1466
                                                if a.attrs["type"] != "require":
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1467
                                                        continue
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1468
                                                targets.append(pkg.fmri.PkgFmri(
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1469
                                                    a.attrs["fmri"], "5.11"
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1470
                                                    ).pkg_name)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1471
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1472
                                for pkg_name in ret[p].keys():
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1473
                                        if pkg_name in targets:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1474
                                                del ret[p][pkg_name]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1475
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1476
                matchdict = {} 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1477
                for p in patterns:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1478
                        l = len(ret[p])
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1479
                        if l == 0: # no matches at all
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1480
                                if not all_known or p not in rejected_pubs:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1481
                                        nonmatch.append(p)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1482
                                elif p in rejected_pubs:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1483
                                        wrongpub.append((p, rejected_pubs[p]))
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1484
                        elif l > 1 and p not in wildcard_patterns:  # multiple matches
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1485
                                multimatch.append((p, [n for n in ret[p]]))
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1486
                        else:      # single match or wildcard
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1487
                                for k in ret[p].keys(): # for each matching package name
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1488
                                        matchdict.setdefault(k, []).append(p)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1489
                
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1490
                for name in matchdict:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1491
                        if len(matchdict[name]) > 1: # different pats, same pkg
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1492
                                multispec.append(tuple([name] + matchdict[name]))
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1493
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1494
                if not all_known:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1495
                        not_installed, nonmatch = nonmatch, not_installed
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1496
                        
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1497
                if illegals or nonmatch or multimatch or not_installed or \
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1498
                    multispec or wrongpub:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1499
                        raise api_errors.PlanCreationException(unmatched_fmris=nonmatch,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1500
                            multiple_matches=multimatch, illegal=illegals,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1501
                            missing_matches=not_installed, multispec=multispec, wrong_publishers=wrongpub)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1502
                # merge patterns together now that there are no conflicts
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1503
                proposed_dict = {}
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1504
                for d in ret.values():
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1505
                        proposed_dict.update(d)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1506
                
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1507
                # eliminate lower ranked publishers
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1508
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1509
                if all_known: # no point for installed pkgs....
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1510
                        for pkg_name in proposed_dict:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1511
                                pubs_found = set([
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1512
                                                f.get_publisher()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1513
                                                for f in proposed_dict[pkg_name]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1514
                                                ])
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1515
                                # 1000 is hack for installed but unconfigured publishers
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1516
                                best_pub = sorted([
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1517
                                                (pub_ranks.get(p, (1000, True))[0], p) 
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1518
                                                for p in pubs_found
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1519
                                                ])[0][1]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1520
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1521
                                proposed_dict[pkg_name] = [
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1522
                                        f
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1523
                                        for f in proposed_dict[pkg_name]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1524
                                        if f.get_publisher() == best_pub
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1525
                                        ]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1526
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1527
                # construct references so that we can know which pattern
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1528
                # generated which fmris...
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1529
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1530
                references = dict([
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1531
                        (f, p)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1532
                        for p in ret.keys()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1533
                        for flist in ret[p].values()
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1534
                        for f in flist
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1535
                        ])
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1536
                
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1461
diff changeset
  1537
                return proposed_dict, references