src/modules/client/imageplan.py
author Bart Smaalders <Bart.Smaalders@Sun.COM>
Fri, 10 Oct 2008 22:15:14 -0700
changeset 584 22bc748edce6
parent 580 be647ae49f92
child 598 c53f6107fdb6
permissions -rw-r--r--
577 need service action for smf(5) manifests 578 need restart action or equivalent to poke smf(5) services
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
409
713e20963dc2 2314 shebang lines should use minimum python version
Shawn Walker <swalker@opensolaris.org>
parents: 384
diff changeset
     1
#!/usr/bin/python2.4
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
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
    23
# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    24
# Use is subject to license terms.
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    25
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
    26
import os
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    27
import pkg.fmri as fmri
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
    28
import pkg.client.api_errors as api_errors
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
    29
import pkg.client.imagestate as imagestate
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    30
import pkg.client.pkgplan as pkgplan
516
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
    31
import pkg.client.indexer as indexer
495
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
    32
import pkg.search_errors as se
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
    33
from pkg.client.imageconfig import REQUIRE_OPTIONAL
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
    34
import pkg.client.actuator as actuator
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
    35
111
647c91609117 Client-side filtering.
Danek Duvall <danek.duvall@sun.com>
parents: 67
diff changeset
    36
from pkg.client.filter import compile_filter
384
9d4746e5dd3e 115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents: 368
diff changeset
    37
from pkg.misc import msg
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
    38
from pkg.misc import CLIENT_DEFAULT_MEM_USE_KB
111
647c91609117 Client-side filtering.
Danek Duvall <danek.duvall@sun.com>
parents: 67
diff changeset
    39
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
from pkg.client.retrieve import ManifestRetrievalError
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
    41
from pkg.client.retrieve import DatastreamRetrievalError
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
    42
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
    43
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
    44
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
    45
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
    46
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
    47
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
    48
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
    49
EXECUTED_ERROR    = 6 # failed
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    51
class ImagePlan(object):
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    52
        """An image plan takes a list of requested packages, an Image (and its
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    53
        policy restrictions), and returns the set of package operations needed
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    54
        to transform the Image to the list of requested packages.
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    55
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    56
        Use of an ImagePlan involves the identification of the Image, the
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    57
        Catalogs (implicitly), and a set of complete or partial package FMRIs.
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    58
        The Image's policy, which is derived from its type and configuration
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    59
        will cause the formulation of the plan or an exception state.
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    60
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    61
        XXX In the current formulation, an ImagePlan can handle [null ->
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    62
        PkgFmri] and [PkgFmri@Version1 -> PkgFmri@Version2], for a set of
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    63
        PkgFmri objects.  With a correct Action object definition, deletion
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    64
        should be able to be represented as [PkgFmri@V1 -> null].
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    65
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    66
        XXX Should we allow downgrades?  There's an "arrow of time" associated
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    67
        with the smf(5) configuration method, so it's better to direct
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    68
        manipulators to snapshot-based rollback, but if people are going to do
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    69
        "pkg delete fmri; pkg install fmri@v(n - 1)", then we'd better have a
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    70
        plan to identify when this operation is safe or unsafe."""
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    71
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
    72
        def __init__(self, image, progtrack, check_cancelation,
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
    73
            recursive_removal = False, filters = None, noexecute = False):
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
    74
                if filters is None:
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
    75
                        filters = []
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    76
                self.image = image
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    77
                self.state = UNEVALUATED
67
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
    78
                self.recursive_removal = recursive_removal
235
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 195
diff changeset
    79
                self.progtrack = progtrack
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    80
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
    81
                self.noexecute = noexecute
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
    82
                if noexecute:
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
    83
                        self.__intent = imagestate.INTENT_EVALUATE
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
    84
                else:
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
    85
                        self.__intent = imagestate.INTENT_PROCESS
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
    86
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    87
                self.target_fmris = []
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
    88
                self.target_rem_fmris = []
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    89
                self.pkg_plans = []
577
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
    90
                self.target_insall_count = 0
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
    91
		self.target_update_count = 0
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
    92
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
    93
                self.__directories = None
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
    94
                self.__link_actions = None
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
    95
111
647c91609117 Client-side filtering.
Danek Duvall <danek.duvall@sun.com>
parents: 67
diff changeset
    96
                ifilters = [
647c91609117 Client-side filtering.
Danek Duvall <danek.duvall@sun.com>
parents: 67
diff changeset
    97
                    "%s = %s" % (k, v)
647c91609117 Client-side filtering.
Danek Duvall <danek.duvall@sun.com>
parents: 67
diff changeset
    98
                    for k, v in image.cfg_cache.filters.iteritems()
647c91609117 Client-side filtering.
Danek Duvall <danek.duvall@sun.com>
parents: 67
diff changeset
    99
                ]
647c91609117 Client-side filtering.
Danek Duvall <danek.duvall@sun.com>
parents: 67
diff changeset
   100
                self.filters = [ compile_filter(f) for f in filters + ifilters ]
647c91609117 Client-side filtering.
Danek Duvall <danek.duvall@sun.com>
parents: 67
diff changeset
   101
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
   102
                self.check_cancelation = check_cancelation
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
   103
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   104
                self.actuators = None
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   105
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   106
        def __str__(self):
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   107
                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
   108
                        s = "UNEVALUATED:\n"
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   109
                        for t in self.target_fmris:
63
ba3a4af65479 add -R/$PKG_IMAGE to pkg, and -n and -v to install
Danek Duvall <danek.duvall@sun.com>
parents: 60
diff changeset
   110
                                s = s + "+%s\n" % t
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   111
                        for t in self.target_rem_fmris:
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   112
                                s = s + "-%s\n" % t
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   113
                        return s
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   114
63
ba3a4af65479 add -R/$PKG_IMAGE to pkg, and -n and -v to install
Danek Duvall <danek.duvall@sun.com>
parents: 60
diff changeset
   115
                s = ""
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   116
                for pp in self.pkg_plans:
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   117
                        s = s + "%s\n" % pp
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   118
                
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   119
                s = s + "Actuators:\n%s" % self.actuators
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   120
                return s
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   121
539
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   122
        def get_plan(self, full=True):
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   123
                if full:
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   124
                        return str(self)
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   125
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   126
                output = ""
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   127
                for pp in self.pkg_plans:
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   128
                        output += "%s -> %s\n" % (pp.origin_fmri,
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   129
                            pp.destination_fmri)
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   130
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   131
                return output
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 516
diff changeset
   132
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   133
        def display(self):
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   134
                for pp in self.pkg_plans:
384
9d4746e5dd3e 115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents: 368
diff changeset
   135
                        msg("%s -> %s" % (pp.origin_fmri, pp.destination_fmri))
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   136
                msg("Actuators:\n" % self.actuators)
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   137
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   138
        def is_proposed_fmri(self, fmri):
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   139
                for pf in self.target_fmris:
258
b3b7592412ec 270 Need ability to rename packages
johansen <johansen@sun.com>
parents: 251
diff changeset
   140
                        if self.image.fmri_is_same_pkg(fmri, pf):
316
d6ba58c63264 1039 circular dependency in packages is detected at install-time
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 315
diff changeset
   141
                                return not self.image.fmri_is_successor(fmri, pf)
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   142
                return False
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   143
67
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   144
        def is_proposed_rem_fmri(self, fmri):
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   145
                for pf in self.target_rem_fmris:
258
b3b7592412ec 270 Need ability to rename packages
johansen <johansen@sun.com>
parents: 251
diff changeset
   146
                        if self.image.fmri_is_same_pkg(fmri, pf):
67
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   147
                                return True
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   148
                return False
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   149
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   150
        def propose_fmri(self, fmri):
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   151
                # is a version of fmri.stem in the inventory?
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   152
                if self.image.has_version_installed(fmri):
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   153
                        return
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   154
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   155
                #   is there a freeze or incorporation statement?
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   156
                #   do any of them eliminate this fmri version?
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   157
                #     discard
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   158
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   159
                #
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   160
                # update so that we meet any optional dependencies
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   161
                #
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   162
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   163
                fmri = self.image.apply_optional_dependencies(fmri)
316
d6ba58c63264 1039 circular dependency in packages is detected at install-time
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 315
diff changeset
   164
64
3233dde68b2e support installing multiple packages at once from the commandline
Danek Duvall <danek.duvall@sun.com>
parents: 63
diff changeset
   165
                # Add fmri to target list only if it (or a successor) isn't
3233dde68b2e support installing multiple packages at once from the commandline
Danek Duvall <danek.duvall@sun.com>
parents: 63
diff changeset
   166
                # there already.
3233dde68b2e support installing multiple packages at once from the commandline
Danek Duvall <danek.duvall@sun.com>
parents: 63
diff changeset
   167
                for i, p in enumerate(self.target_fmris):
258
b3b7592412ec 270 Need ability to rename packages
johansen <johansen@sun.com>
parents: 251
diff changeset
   168
                        if self.image.fmri_is_successor(fmri, p):
b3b7592412ec 270 Need ability to rename packages
johansen <johansen@sun.com>
parents: 251
diff changeset
   169
                                self.target_fmris[i] = fmri
b3b7592412ec 270 Need ability to rename packages
johansen <johansen@sun.com>
parents: 251
diff changeset
   170
                                break
472
9cec1a1677e1 2795 two versions of a package can be installed
Tom Mueller <Tom.Mueller@sun.com>
parents: 462
diff changeset
   171
                        if self.image.fmri_is_successor(p, fmri):
9cec1a1677e1 2795 two versions of a package can be installed
Tom Mueller <Tom.Mueller@sun.com>
parents: 462
diff changeset
   172
                                break
64
3233dde68b2e support installing multiple packages at once from the commandline
Danek Duvall <danek.duvall@sun.com>
parents: 63
diff changeset
   173
                else:
3233dde68b2e support installing multiple packages at once from the commandline
Danek Duvall <danek.duvall@sun.com>
parents: 63
diff changeset
   174
                        self.target_fmris.append(fmri)
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   175
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   176
                return
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   177
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   178
        def older_version_proposed(self, fmri):
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   179
                # returns true if older version of this fmri has been
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   180
                # proposed already
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   181
                for p in self.target_fmris:
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   182
                        if self.image.fmri_is_successor(fmri, p):
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   183
                                return True
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   184
                return False
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   185
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   186
        # XXX Need to make sure that the same package isn't being added and
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   187
        # removed in the same imageplan.
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   188
        def propose_fmri_removal(self, fmri):
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   189
                if not self.image.has_version_installed(fmri):
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   190
                        return
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   191
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   192
                for i, p in enumerate(self.target_rem_fmris):
258
b3b7592412ec 270 Need ability to rename packages
johansen <johansen@sun.com>
parents: 251
diff changeset
   193
                        if self.image.fmri_is_successor(fmri, p):
b3b7592412ec 270 Need ability to rename packages
johansen <johansen@sun.com>
parents: 251
diff changeset
   194
                                self.target_rem_fmris[i] = fmri
b3b7592412ec 270 Need ability to rename packages
johansen <johansen@sun.com>
parents: 251
diff changeset
   195
                                break
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   196
                else:
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   197
                        self.target_rem_fmris.append(fmri)
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   198
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   199
        def gen_new_installed_pkgs(self):
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   200
                """ generates all the actions 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
   201
                assert self.state >= EVALUATED_PKGS
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   202
                fmri_set = set(self.image.gen_installed_pkgs())
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   203
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   204
                for p in self.pkg_plans:
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   205
                        p.update_pkg_set(fmri_set)
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   206
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   207
                for fmri in fmri_set:
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   208
                        yield fmri
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   209
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   210
        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
   211
                """generates actions in new installed image"""
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   212
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   213
                for fmri in self.gen_new_installed_pkgs():
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   214
                        for act in self.image.get_manifest(fmri, 
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   215
                            filtered=True).actions:
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   216
                                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
   217
567
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   218
        def gen_new_installed_actions_bytype(self, type):
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   219
                """generates actions in new installed image"""
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   220
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   221
                for fmri in self.gen_new_installed_pkgs():
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   222
                        m = self.image.get_manifest(fmri, filtered=True)
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   223
                        for act in m.gen_actions_by_type(type):
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   224
                                yield act
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   225
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   226
        def get_directories(self):
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   227
                """ return set of all directories in target image """
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   228
                # 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
   229
                # 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
   230
                if self.__directories == None:
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   231
                        dirs = set(["var/pkg", "var/sadm/install"])
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   232
                        dirs.update(
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   233
                            [
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   234
                                os.path.normpath(d)
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   235
                                for act in self.gen_new_installed_actions()
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   236
                                for d in act.directory_references()
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   237
                        ])
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   238
                        self.__directories = self.image.expanddirs(dirs)
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   239
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   240
                return self.__directories
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   241
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   242
        def get_link_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
   243
                """return a dictionary of hardlink action lists indexed by
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   244
                target """
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   245
                if self.__link_actions == None:
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   246
                        d = {}
567
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   247
                        for act in \
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   248
                            self.gen_new_installed_actions_bytype("hardlink"):
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   249
                                t = act.get_target_path()
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   250
                                if t in d:
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   251
                                        d[t].append(act)
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   252
                                else:
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   253
                                        d[t] = [act]
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   254
                self.__link_actions = d
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   255
                return self.__link_actions
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   256
                
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   257
        def evaluate_fmri(self, pfmri):
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   258
577
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   259
                self.progtrack.evaluate_progress(pfmri)
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
   260
                self.image.state.set_target(pfmri, self.__intent)
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
   261
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
   262
                if self.check_cancelation():
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
   263
                        raise api_errors.CanceledException()
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
   264
                
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   265
                m = self.image.get_manifest(pfmri)
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   266
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   267
                # [manifest] examine manifest for dependencies
567
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
   268
                for a in m.gen_actions_by_type("depend"):
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   269
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   270
                        type = a.attrs["type"]
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   271
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   272
                        f = fmri.PkgFmri(a.attrs["fmri"],
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   273
                            self.image.attrs["Build-Release"])
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   274
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   275
                        if self.image.has_version_installed(f) and \
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   276
                                    type != "exclude":
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   277
                                continue
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   278
65
af18f4c81c61 Prevent infinite dependency recursion on install.
Danek Duvall <danek.duvall@sun.com>
parents: 64
diff changeset
   279
                        # XXX This alone only prevents infinite recursion when a
af18f4c81c61 Prevent infinite dependency recursion on install.
Danek Duvall <danek.duvall@sun.com>
parents: 64
diff changeset
   280
                        # cycle member is on the commandline, as we never update
af18f4c81c61 Prevent infinite dependency recursion on install.
Danek Duvall <danek.duvall@sun.com>
parents: 64
diff changeset
   281
                        # target_fmris.  Is target_fmris supposed to be just
af18f4c81c61 Prevent infinite dependency recursion on install.
Danek Duvall <danek.duvall@sun.com>
parents: 64
diff changeset
   282
                        # what was specified on the commandline, or include what
af18f4c81c61 Prevent infinite dependency recursion on install.
Danek Duvall <danek.duvall@sun.com>
parents: 64
diff changeset
   283
                        # we've found while processing dependencies?
af18f4c81c61 Prevent infinite dependency recursion on install.
Danek Duvall <danek.duvall@sun.com>
parents: 64
diff changeset
   284
                        # XXX probably should just use propose_fmri() here
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   285
                        # instead of this and the has_version_installed() call
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   286
                        # above.
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   287
                        if self.is_proposed_fmri(f):
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   288
                                continue
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   289
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   290
                        # XXX LOG  "%s not in pending transaction;
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   291
                        # checking catalog" % f
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   292
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   293
                        required = True
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   294
                        excluded = False
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   295
                        if type == "optional" and \
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
   296
                            not self.image.cfg_cache.get_policy(REQUIRE_OPTIONAL):
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   297
                                required = False
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   298
                        elif type == "transfer" and \
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   299
                            not self.image.older_version_installed(f):
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   300
                                required = False
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   301
                        elif type == "exclude":
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   302
                                excluded = True
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   303
                        elif type == "incorporate":
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   304
                                self.image.update_optional_dependency(f)
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   305
                                if self.image.older_version_installed(f) or \
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   306
                                    self.older_version_proposed(f):
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   307
                                        required = True
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   308
                                else:
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   309
                                        required = False
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   310
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   311
                        if not required:
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   312
                                continue
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   313
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   314
                        if excluded:
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
   315
                                self.image.state.set_target()
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   316
                                raise RuntimeError, "excluded by '%s'" % f
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   317
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   318
                        # treat-as-required, treat-as-required-unless-pinned,
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   319
                        # ignore
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   320
                        # skip if ignoring
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   321
                        #     if pinned
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   322
                        #       ignore if treat-as-required-unless-pinned
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   323
                        #     else
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   324
                        #       **evaluation of incorporations**
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   325
                        #     [imageplan] pursue installation of this package
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   326
                        #     -->
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   327
                        #     backtrack or reset??
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   328
419
a38f1ed7cf76 1867 'pkg list' takes *WAY* too long
Danek Duvall <danek.duvall@sun.com>
parents: 417
diff changeset
   329
                        # This will be the newest version of the specified
a38f1ed7cf76 1867 'pkg list' takes *WAY* too long
Danek Duvall <danek.duvall@sun.com>
parents: 417
diff changeset
   330
                        # dependency package, coming from the preferred
a38f1ed7cf76 1867 'pkg list' takes *WAY* too long
Danek Duvall <danek.duvall@sun.com>
parents: 417
diff changeset
   331
                        # authority, if it's available there.
a38f1ed7cf76 1867 'pkg list' takes *WAY* too long
Danek Duvall <danek.duvall@sun.com>
parents: 417
diff changeset
   332
                        cf = self.image.inventory([ a.attrs["fmri"] ],
a38f1ed7cf76 1867 'pkg list' takes *WAY* too long
Danek Duvall <danek.duvall@sun.com>
parents: 417
diff changeset
   333
                            all_known = True, preferred = True,
a38f1ed7cf76 1867 'pkg list' takes *WAY* too long
Danek Duvall <danek.duvall@sun.com>
parents: 417
diff changeset
   334
                            first_only = True).next()[0]
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   335
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   336
                        # XXX LOG "adding dependency %s" % pfmri
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   337
384
9d4746e5dd3e 115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents: 368
diff changeset
   338
                        #msg("adding dependency %s" % cf)
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   339
258
b3b7592412ec 270 Need ability to rename packages
johansen <johansen@sun.com>
parents: 251
diff changeset
   340
                        self.propose_fmri(cf)
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   341
                        self.evaluate_fmri(cf)
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   342
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
   343
                self.image.state.set_target()
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
   344
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   345
        def add_pkg_plan(self, pfmri):
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   346
                """add a pkg plan to imageplan for fully evaluated frmi"""
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   347
                m = self.image.get_manifest(pfmri)
580
be647ae49f92 3717 More cancelation points are needed to allow gui responsiveness
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 577
diff changeset
   348
                pp = pkgplan.PkgPlan(self.image, self.progtrack, \
be647ae49f92 3717 More cancelation points are needed to allow gui responsiveness
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 577
diff changeset
   349
                    self.check_cancelation)
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   350
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   351
                try:
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   352
                        pp.propose_destination(pfmri, m)
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   353
                except RuntimeError:
384
9d4746e5dd3e 115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents: 368
diff changeset
   354
                        msg("pkg: %s already installed" % pfmri)
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 50
diff changeset
   355
                        return
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   356
111
647c91609117 Client-side filtering.
Danek Duvall <danek.duvall@sun.com>
parents: 67
diff changeset
   357
                pp.evaluate(self.filters)
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   358
577
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   359
                if pp.origin_fmri:
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   360
                        self.target_update_count += 1
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   361
                else:
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   362
                        self.target_insall_count += 1
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   363
                        
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   364
                self.pkg_plans.append(pp)
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   365
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   366
        def evaluate_fmri_removal(self, pfmri):
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   367
                # prob. needs breaking up as well
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   368
                assert self.image.has_manifest(pfmri)
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   369
577
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   370
                self.progtrack.evaluate_progress(pfmri)
432
578875da6e04 48 Removing a dependency is not flagged, and recovery is not obvious
Danek Duvall <danek.duvall@sun.com>
parents: 429
diff changeset
   371
578875da6e04 48 Removing a dependency is not flagged, and recovery is not obvious
Danek Duvall <danek.duvall@sun.com>
parents: 429
diff changeset
   372
                dependents = self.image.get_dependents(pfmri, self.progtrack)
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   373
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   374
                # Don't consider those dependencies already being removed in
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   375
                # this imageplan transaction.
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   376
                for i, d in enumerate(dependents):
432
578875da6e04 48 Removing a dependency is not flagged, and recovery is not obvious
Danek Duvall <danek.duvall@sun.com>
parents: 429
diff changeset
   377
                        if d in self.target_rem_fmris:
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   378
                                del dependents[i]
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
   379
67
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   380
                if dependents and not self.recursive_removal:
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
   381
                        raise api_errors.NonLeafPackageException(pfmri,
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
   382
                            dependents)
67
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   383
580
be647ae49f92 3717 More cancelation points are needed to allow gui responsiveness
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 577
diff changeset
   384
                pp = pkgplan.PkgPlan(self.image, self.progtrack, \
be647ae49f92 3717 More cancelation points are needed to allow gui responsiveness
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 577
diff changeset
   385
                    self.check_cancelation)
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   386
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
   387
                self.image.state.set_target(pfmri, self.__intent)
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
   388
                m = self.image.get_manifest(pfmri)
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   389
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   390
                try:
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   391
                        pp.propose_removal(pfmri, m)
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   392
                except RuntimeError:
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
   393
                        self.image.state.set_target()
384
9d4746e5dd3e 115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents: 368
diff changeset
   394
                        msg("pkg %s not installed" % pfmri)
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   395
                        return
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   396
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   397
                pp.evaluate()
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   398
67
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   399
                for d in dependents:
432
578875da6e04 48 Removing a dependency is not flagged, and recovery is not obvious
Danek Duvall <danek.duvall@sun.com>
parents: 429
diff changeset
   400
                        if self.is_proposed_rem_fmri(d):
578875da6e04 48 Removing a dependency is not flagged, and recovery is not obvious
Danek Duvall <danek.duvall@sun.com>
parents: 429
diff changeset
   401
                                continue
578875da6e04 48 Removing a dependency is not flagged, and recovery is not obvious
Danek Duvall <danek.duvall@sun.com>
parents: 429
diff changeset
   402
                        if not self.image.has_version_installed(d):
67
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   403
                                continue
432
578875da6e04 48 Removing a dependency is not flagged, and recovery is not obvious
Danek Duvall <danek.duvall@sun.com>
parents: 429
diff changeset
   404
                        self.target_rem_fmris.append(d)
577
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   405
                        self.progtrack.evaluate_progress(d)
432
578875da6e04 48 Removing a dependency is not flagged, and recovery is not obvious
Danek Duvall <danek.duvall@sun.com>
parents: 429
diff changeset
   406
                        self.evaluate_fmri_removal(d)
67
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   407
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   408
                # Post-order append will ensure topological sorting for acyclic
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   409
                # dependency graphs.  Cycles need to be arbitrarily broken, and
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   410
                # are done so in the loop above.
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   411
                self.pkg_plans.append(pp)
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
   412
                self.image.state.set_target()
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   413
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   414
        def evaluate(self):
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   415
                assert self.state == UNEVALUATED
577
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   416
                
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   417
                evaluate_npkgs = len(self.target_fmris) + \
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   418
                    len(self.target_rem_fmris)
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   419
                self.progtrack.evaluate_start(evaluate_npkgs)
235
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 195
diff changeset
   420
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
   421
                outstring = ""
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   422
65
af18f4c81c61 Prevent infinite dependency recursion on install.
Danek Duvall <danek.duvall@sun.com>
parents: 64
diff changeset
   423
                # Operate on a copy, as it will be modified in flight.
af18f4c81c61 Prevent infinite dependency recursion on install.
Danek Duvall <danek.duvall@sun.com>
parents: 64
diff changeset
   424
                for f in self.target_fmris[:]:
577
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   425
                        self.progtrack.evaluate_progress(f)
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
   426
                        try:
777fb019e807 1338 traceback when installing a package with a dependency that can not be satisfied
Brock Pytlik <bpytlik@sun.com>
parents: 329
diff changeset
   427
                                self.evaluate_fmri(f)
777fb019e807 1338 traceback when installing a package with a dependency that can not be satisfied
Brock Pytlik <bpytlik@sun.com>
parents: 329
diff changeset
   428
                        except KeyError, e:
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
   429
                                outstring += "Attempting to install %s " \
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 551
diff changeset
   430
                                    "causes:\n\t%s\n" % (f.get_name(), e)
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
   431
                        except (ManifestRetrievalError,
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
   432
                            DatastreamRetrievalError), e:
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
   433
                                raise api_errors.NetworkUnavailableException(
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 556
diff changeset
   434
                                    str(e))
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   435
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
   436
                if outstring:
777fb019e807 1338 traceback when installing a package with a dependency that can not be satisfied
Brock Pytlik <bpytlik@sun.com>
parents: 329
diff changeset
   437
                        raise RuntimeError("No packages were installed because "
777fb019e807 1338 traceback when installing a package with a dependency that can not be satisfied
Brock Pytlik <bpytlik@sun.com>
parents: 329
diff changeset
   438
                            "package dependencies could not be satisfied\n" +
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   439
                            outstring)
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   440
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   441
                for f in self.target_fmris:
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   442
                        self.add_pkg_plan(f)
577
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   443
                        self.progtrack.evaluate_progress(f)
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   444
67
62c897652bbc Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents: 66
diff changeset
   445
                for f in self.target_rem_fmris[:]:
66
e307f4f837c3 support package removal
Danek Duvall <danek.duvall@sun.com>
parents: 65
diff changeset
   446
                        self.evaluate_fmri_removal(f)
577
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   447
                        self.progtrack.evaluate_progress(f)
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   448
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   449
                # we now have a workable set of packages to add/upgrade/remove
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   450
                # 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
   451
                # 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
   452
                # 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
   453
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   454
                self.state = EVALUATED_PKGS
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   455
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   456
                self.removal_actions = [ (p, src, dest)
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   457
                                         for p in self.pkg_plans
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   458
                                         for src, dest in p.gen_removal_actions()
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   459
                ]
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   460
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   461
                self.update_actions = [ (p, src, dest)
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   462
                                        for p in self.pkg_plans
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   463
                                        for src, dest in p.gen_update_actions()
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   464
                ]
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   465
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   466
                self.install_actions = [ (p, src, dest)
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   467
                                         for p in self.pkg_plans
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   468
                                         for src, dest in p.gen_install_actions()
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   469
                ]
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   470
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   471
                self.progtrack.evaluate_progress()
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   472
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   473
                self.actuators = actuator.Actuator()
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   474
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   475
                # iterate over copy of removals since we're modding list
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   476
                # keep track of deletion count so later use of index works
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   477
                named_removals = {}
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   478
                deletions = 0
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   479
                for i, a in enumerate(self.removal_actions[:]):
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   480
                        # remove dir removals if dir is still in final image
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   481
                        if a[1].name == "dir" and \
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   482
                            os.path.normpath(a[1].attrs["path"]) in \
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   483
                            self.get_directories():
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   484
                                del self.removal_actions[i - deletions]
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   485
                                deletions += 1
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   486
                                continue
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   487
                        # 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
   488
                        # or original name if specified
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   489
                        if a[1].name == "file":
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   490
                                attrs = a[1].attrs
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   491
                                fname = attrs.get("original_name",
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   492
                                    "%s:%s" % (a[0].origin_fmri.get_name(), 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
   493
                                named_removals[fname] = \
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   494
                                    (i - deletions,
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   495
                                    id(self.removal_actions[i-deletions][1]))
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   496
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   497
                        self.actuators.scan_removal(a[1].attrs)
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   498
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   499
                self.progtrack.evaluate_progress()
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   500
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   501
                for a in self.install_actions:
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   502
                        # In order to handle editable files that move their path or
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   503
                        # change pkgs, for all new files with original_name attribute,
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   504
                        # make sure file isn't being removed by checking removal list.
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   505
                        # if it is, tag removal to save file, and install to recover
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   506
                        # cached version... caching is needed if directories
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   507
                        # are removed or don't exist yet.
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   508
                        if a[2].name == "file" and "original_name" in a[2].attrs and \
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   509
                            a[2].attrs["original_name"] in named_removals:
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   510
                                cache_name = a[2].attrs["original_name"]
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   511
                                index = named_removals[cache_name][0]
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   512
                                assert(id(self.removal_actions[index][1]) == 
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   513
                                       named_removals[cache_name][1])
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   514
                                self.removal_actions[index][1].attrs["save_file"] = \
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   515
                                    cache_name
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   516
                                a[2].attrs["save_file"] = cache_name
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   517
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   518
                        self.actuators.scan_install(a[2].attrs)
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   519
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   520
                self.progtrack.evaluate_progress()
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   521
                # Go over update actions
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   522
                l_actions = self.get_link_actions()
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   523
                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
   524
                for a in self.update_actions:
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   525
                        # for any files being updated that are the target of
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   526
                        # _any_ hardlink actions, append the hardlink actions
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   527
                        # to the update list so that they are not broken...
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   528
                        if a[2].name == "file": 
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   529
                                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
   530
                                if path in l_actions:
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   531
                                        l_refresh.extend([(a[0], l, l) for l in l_actions[path]])
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   532
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   533
                        # 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
   534
                        # 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
   535
                        if a[1]:
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   536
                                self.actuators.scan_update(a[1].attrs)
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   537
                        self.actuators.scan_update(a[2].attrs)
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   538
                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
   539
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   540
                # 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
   541
                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
   542
                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
   543
                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
   544
577
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   545
                remove_npkgs = len(self.target_rem_fmris)
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   546
                npkgs = 0
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   547
                nfiles = 0
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   548
                nbytes = 0
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   549
                nactions = 0
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   550
                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
   551
                        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
   552
                        nbytes += nb
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   553
                        nfiles += nf
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   554
                        nactions += p.get_nactions()
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   555
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   556
                        # 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
   557
                        # 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
   558
                        # 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
   559
                        # install.
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   560
                        npkgs += 1
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   561
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   562
                self.progtrack.download_set_goal(npkgs, nfiles, nbytes)
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   563
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   564
                self.progtrack.evaluate_done(self.target_insall_count, \
cd4e8df4322b 873 Text is wrong in the General Info tab
Michal Pryc <Michal.Pryc@Sun.Com>
parents: 567
diff changeset
   565
                    self.target_update_count, remove_npkgs)
235
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 195
diff changeset
   566
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   567
                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
   568
329
f549eab0d7b7 735 install -n uninformative
Dan Price <dp@eng.sun.com>
parents: 316
diff changeset
   569
        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
   570
                """ 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
   571
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
   572
                return not self.pkg_plans
329
f549eab0d7b7 735 install -n uninformative
Dan Price <dp@eng.sun.com>
parents: 316
diff changeset
   573
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   574
        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
   575
                """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
   576
                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
   577
                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
   578
                """
6ece196588cb 348 files that move from pkg to pkg can cause problems during upgrade
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 235
diff changeset
   579
                
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   580
                assert self.state == EVALUATED_OK
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   581
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
   582
                if self.nothingtodo():
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   583
                        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
   584
                        return
329
f549eab0d7b7 735 install -n uninformative
Dan Price <dp@eng.sun.com>
parents: 316
diff changeset
   585
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   586
                # 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
   587
                # 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
   588
                # 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
   589
                # 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
   590
                # 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
   591
                # 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
   592
                # correct index.
495
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   593
                try:
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   594
                        self.image.update_index_dir()
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   595
                        ind = indexer.Indexer(self.image.index_dir,
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   596
                            CLIENT_DEFAULT_MEM_USE_KB, progtrack=self.progtrack)
516
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   597
                        if not ind.check_index_existence() or \
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   598
                            not ind.check_index_has_exactly_fmris(
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   599
                                self.image.gen_installed_pkg_names()):
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   600
                                # XXX Once we have a framework for emitting a
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   601
                                # message to the user in this spot in the
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   602
                                # code, we should tell them something has gone
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   603
                                # wrong so that we continue to get feedback to
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   604
                                # allow us to debug the code.
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   605
                                ind.rebuild_index_from_scratch(
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   606
                                    self.image.get_fmri_manifest_pairs())
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   607
                except se.IndexingException:
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   608
                        # If there's a problem indexing, we want to attempt
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   609
                        # to finish the installation anyway. If there's a
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   610
                        # problem updating the index on the new image,
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   611
                        # that error needs to be communicated to the user.
53da6297fb65 3039 Install and Image-update should check index consistency with installed packages
Brock Pytlik <bpytlik@sun.com>
parents: 495
diff changeset
   612
                        pass
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   613
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   614
                try:
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   615
                        for p in self.pkg_plans:
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   616
                                p.preexecute()
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   617
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
   618
                        for p in self.pkg_plans:
9fa0541013b3 2402 pkg unable to remove executable file that is in use on Windows
Tom Mueller <Tom.Mueller@sun.com>
parents: 472
diff changeset
   619
                                p.download()
9fa0541013b3 2402 pkg unable to remove executable file that is in use on Windows
Tom Mueller <Tom.Mueller@sun.com>
parents: 472
diff changeset
   620
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   621
                        self.progtrack.download_done()
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   622
                except:
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   623
                        self.state = PREEXECUTED_ERROR
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   624
                        raise
235
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 195
diff changeset
   625
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   626
                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
   627
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   628
        def execute(self):
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   629
                """Invoke the evaluated image plan
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   630
                preexecute, execute and postexecute
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   631
                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
   632
                """
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   633
                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
   634
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   635
                #
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   636
                # 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
   637
                #
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   638
                # 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
   639
                # execution:
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   640
                #
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   641
                # 1) All non-directory actions (files, users, hardlinks, symbolic
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   642
                # links, etc.) must appear in only a single installed package. 
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   643
                #
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   644
                # 2) All installed packages must be consistent in their view of
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   645
                # action types; if /usr/openwin is a directory in one package, it
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   646
                # must be a directory in all packages, never a symbolic link.  This
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   647
                # includes implicitly defined directories.
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   648
                # 
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   649
                # A key goal in IPS is to be able to undergo an arbtrary transformation
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   650
                # in package contents in a single step.  Packages must be able to exchange
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   651
                # files, convert directories to symbolic links, etc.; so long as the start
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   652
                # and end states meet the above two constraints IPS must be able to transition
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   653
                # between the states directly.  This leads to the following:
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   654
                # 
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   655
                # 1) All actions must be ordered across packages; packages cannot be updated 
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   656
                #    one at a time.
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   657
                #
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   658
                #    This is readily apparent when one considers two packages exchanging 
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   659
                #    files in their new versions; in each case the package now owning the
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   660
                #    file must be installed last, but it is not possible for each package to
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   661
                #    to be installed before the other.  Clearly, all the removals must be done 
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   662
                #    first, followed by the installs and updates.
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   663
                #
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   664
                # 2) Installs of new actions must preceed updates of existing ones.
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   665
                #    
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   666
                #    In order to accomodate changes of file ownership of existing files
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   667
                #    to a newly created user, it is necessary for the installation of that
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   668
                #    user to preceed the update of files to reflect their new ownership.
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   669
                #
417
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   670
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   671
                if self.nothingtodo():
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   672
                        self.state = EXECUTED_OK
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   673
                        return
be3c47d9061f 1249 create snapshot & be after downloading package
Brock Pytlik <bpytlik@sun.com>
parents: 409
diff changeset
   674
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   675
                self.actuators.exec_prep(self.image)
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   676
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   677
                self.actuators.exec_pre_actuators(self.image)
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   678
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   679
                try:
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   680
                
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   681
                        # execute removals
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
   682
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   683
                        self.progtrack.actions_set_goal("Removal Phase",
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   684
                            len(self.removal_actions))
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   685
                        for p, src, dest in self.removal_actions:
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   686
                                p.execute_removal(src, dest)
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   687
                                self.progtrack.actions_add_progress()
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   688
                        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
   689
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   690
                        # execute installs
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   691
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   692
                        self.progtrack.actions_set_goal("Install Phase",
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   693
                            len(self.install_actions))
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   694
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   695
                        for p, src, dest in self.install_actions:
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   696
                                p.execute_install(src, dest)
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   697
                                self.progtrack.actions_add_progress()
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   698
                        self.progtrack.actions_done()
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   699
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   700
                        # execute updates
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
   701
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   702
                        self.progtrack.actions_set_goal("Update Phase",
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   703
                            len(self.update_actions))
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   704
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   705
                        for p, src, dest in self.update_actions:
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   706
                                p.execute_update(src, dest)
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   707
                                self.progtrack.actions_add_progress()
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 296
diff changeset
   708
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   709
                        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
   710
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   711
                        # handle any postexecute operations
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
   712
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   713
                        for p in self.pkg_plans:
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   714
                                p.postexecute()
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   715
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   716
                	self.image.clear_pkg_state()
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   717
                        
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   718
                except:
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   719
                        self.actuators.exec_fail_actuators(self.image)                        
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   720
                        raise
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   721
                else:
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   722
                        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
   723
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents:
diff changeset
   724
                self.state = EXECUTED_OK
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   725
                
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   726
                # reduce memory consumption
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   727
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   728
                del self.removal_actions
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   729
                del self.update_actions
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   730
                del self.install_actions
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   731
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   732
                del self.target_rem_fmris
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   733
                del self.target_fmris
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 456
diff changeset
   734
                del self.__directories
584
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   735
22bc748edce6 577 need service action for smf(5) manifests
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 580
diff changeset
   736
                del self.actuators
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   737
                
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   738
                # 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
   739
                # for all changed packages
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   740
                plan_info = []
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   741
                for p in self.pkg_plans:
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   742
                        d_fmri = p.destination_fmri
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   743
                        d_manifest_path = None
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   744
                        if d_fmri:
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   745
                                d_manifest_path = \
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   746
                                    self.image.get_manifest_path(d_fmri)
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   747
                        o_fmri = p.origin_fmri
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   748
                        o_manifest_path = None
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   749
                        o_filter_file = None
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   750
                        if o_fmri:
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   751
                                o_manifest_path = \
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   752
                                    self.image.get_manifest_path(o_fmri)
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   753
                        plan_info.append((d_fmri, d_manifest_path, o_fmri,
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   754
                                          o_manifest_path))
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   755
                del self.pkg_plans
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   756
                self.progtrack.actions_set_goal("Index Phase", len(plan_info))
495
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   757
                try:
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   758
                        self.image.update_index_dir()
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   759
                        ind = indexer.Indexer(self.image.index_dir,
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   760
                            CLIENT_DEFAULT_MEM_USE_KB, progtrack=self.progtrack)
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   761
                        ind.client_update_index((self.filters, plan_info))
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   762
                except (KeyboardInterrupt,
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   763
                    se.ProblematicPermissionsIndexException):
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   764
                        # ProblematicPermissionsIndexException is included here
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   765
                        # as there's little chance that trying again will fix
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   766
                        # this problem.
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   767
                        raise
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   768
                except Exception, e:
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   769
                        del(ind)
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   770
                        # XXX Once we have a framework for emitting a message
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   771
                        # to the user in this spot in the code, we should tell
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   772
                        # them something has gone wrong so that we continue to
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   773
                        # get feedback to allow us to debug the code.
e420b536e34e 2989 errors during index update shouldn't prevent the operation from succeding
Brock Pytlik <bpytlik@sun.com>
parents: 481
diff changeset
   774
                        self.image.rebuild_search_index(self.progtrack)