src/modules/publish/transaction.py
author Stephen Hahn <sch@Sun.COM>
Mon, 08 Oct 2007 13:18:41 -0700
changeset 135 a1e20e9a9845
parent 102 613f3d9bef66
child 145 08bee7fd13f6
permissions -rw-r--r--
add CLI test suite, correct bugs found by test suite, ration out CLI options
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
     1
#!/usr/bin/python
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
     2
#
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
     3
# CDDL HEADER START
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
     4
#
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
     8
#
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    12
# and limitations under the License.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    13
#
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    19
#
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    20
# CDDL HEADER END
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    21
#
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    22
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    23
#
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    24
# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    25
# Use is subject to license terms.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    26
#
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    27
38
52e6547130fa add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents: 33
diff changeset
    28
# We use urllib2 for GET and POST operations, but httplib for PUT and DELETE
52e6547130fa add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents: 33
diff changeset
    29
# operations.
52e6547130fa add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents: 33
diff changeset
    30
28
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    31
import httplib
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    32
import os
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    33
import urllib
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    34
import urllib2
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    35
import urlparse
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    36
49
c3a70bdc4527 First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents: 44
diff changeset
    37
import pkg.actions
c3a70bdc4527 First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents: 44
diff changeset
    38
28
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    39
class Transaction(object):
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    40
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    41
        def __init__(self):
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    42
                self.cfg = None
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    43
                self.pkg_name = ""
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    44
                return
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    45
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    46
        # XXX This opens a Transaction, but who manages the server connection?
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    47
        # If we want a pipelined HTTP session (multiple operations -- even if
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    48
        # it's only one Transaction -- over a single connection), then we can't
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    49
        # call HTTPConnection.close() here, and we shouldn't reopen the
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    50
        # connection in Transaction.add(), Transaction.close(), etc.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    51
        def open(self, config, pkg_name):
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    52
                self.cfg = config
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    53
                self.pkg_name = pkg_name
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    54
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    55
                repo = self.cfg.install_uri
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    56
                uri_exp = urlparse.urlparse(repo)
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    57
                host, port = uri_exp[1].split(":")
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    58
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    59
                c = httplib.HTTPConnection(host, port)
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    60
                c.connect()
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    61
                c.putrequest("GET", "/open/%s" %
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    62
                        urllib.quote(self.pkg_name, ""))
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    63
                c.putheader("Client-Release", os.uname()[2])
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    64
                c.endheaders()
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    65
56
3aafccb973e1 Deal sanely with server failure in a couple more places
Danek Duvall <danek.duvall@sun.com>
parents: 51
diff changeset
    66
                try:
3aafccb973e1 Deal sanely with server failure in a couple more places
Danek Duvall <danek.duvall@sun.com>
parents: 51
diff changeset
    67
                        r = c.getresponse()
3aafccb973e1 Deal sanely with server failure in a couple more places
Danek Duvall <danek.duvall@sun.com>
parents: 51
diff changeset
    68
                except httplib.BadStatusLine:
3aafccb973e1 Deal sanely with server failure in a couple more places
Danek Duvall <danek.duvall@sun.com>
parents: 51
diff changeset
    69
                        return 500, None
28
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    70
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    71
                id = r.getheader("Transaction-ID", None)
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    72
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    73
                return r.status, id
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    74
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    75
        # XXX shouldn't need to pass trans_id or config in, as it ought to
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    76
        # be part of self.  But currently, the front-end is stateless
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    77
        # across individual transaction elements, so we need to carry this
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    78
        # around.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    79
        def close(self, config, trans_id, abandon=False):
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    80
                op = "close"
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    81
                if abandon:
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    82
                        op = "abandon"
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    83
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    84
                repo = config.install_uri
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    85
                uri = urlparse.urljoin(repo, "%s/%s" % (op, trans_id))
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    86
                try:
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    87
                        c = urllib2.urlopen(uri)
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    88
                except urllib2.HTTPError:
57
ff73d39deeb7 Add a driver action (install only, for now). This requires (and thus
Danek Duvall <danek.duvall@sun.com>
parents: 56
diff changeset
    89
                        return 500, None
56
3aafccb973e1 Deal sanely with server failure in a couple more places
Danek Duvall <danek.duvall@sun.com>
parents: 51
diff changeset
    90
                except httplib.BadStatusLine:
57
ff73d39deeb7 Add a driver action (install only, for now). This requires (and thus
Danek Duvall <danek.duvall@sun.com>
parents: 56
diff changeset
    91
                        return 500, None
28
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    92
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    93
                if abandon:
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    94
                        return c.code, None
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    95
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    96
                # Return only the headers the client should care about.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    97
                # XXX is there any reason to try/except KeyError here?
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    98
                ret_hdrs = ["State", "Package-FMRI"]
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
    99
                return c.code, dict((h, c.info()[h]) for h in ret_hdrs)
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   100
49
c3a70bdc4527 First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents: 44
diff changeset
   101
        def add(self, config, trans_id, action):
30
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 28
diff changeset
   102
                """POST the file contents to the transaction.  Default is to
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 28
diff changeset
   103
                post to the currently open content series.  -s option selects a
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 28
diff changeset
   104
                different series.
28
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   105
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   106
                dir mode owner group path [n=v ...]
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   107
                file mode owner group path [n=v ...]
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   108
                displace mode owner group path [n=v ...]
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   109
                preserve mode owner group path [n=v ...]
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   110
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   111
                link path_from path_to [n=v ...]
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   112
                        This action is exclusively for symbolic links.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   113
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   114
                service manifest_path [n=v ...]
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   115
                        0444 root sys
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   116
                driver class  [n=v ...] (a whole slew of specifiers)
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   117
                        0755 root sys binaries; 0644 root sys conf file
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   118
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   119
                restart fmri [n=v ...]
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   120
                        [no file, illegal in user image]
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   121
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   122
                XXX do we need hardlinks?
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   123
30
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 28
diff changeset
   124
                XXX driver action could follow the upload of two or three files.
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 28
diff changeset
   125
                In this case, the action can either cause the transaction to
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 28
diff changeset
   126
                fail (since modes and ownership may be inconsistent) or correct
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 28
diff changeset
   127
                the transaction to follow convention (with a warning).
28
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   128
30
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 28
diff changeset
   129
                XXX driver action must be architecture tag-dependent, as a
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 28
diff changeset
   130
                driver may exist only on a single platform kind.
28
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   131
30
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 28
diff changeset
   132
                XXX Setting a driver from the command line, rather than via a
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 28
diff changeset
   133
                batched file, seems error prone.
49
c3a70bdc4527 First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents: 44
diff changeset
   134
                """
28
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   135
51
d04d55e16d0b Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents: 49
diff changeset
   136
                type = action.name
49
c3a70bdc4527 First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents: 44
diff changeset
   137
                attrs = action.attrs
28
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   138
49
c3a70bdc4527 First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents: 44
diff changeset
   139
                if not type in pkg.actions.types.keys():
c3a70bdc4527 First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents: 44
diff changeset
   140
                        if "path" in attrs:
c3a70bdc4527 First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents: 44
diff changeset
   141
                                path = attrs["path"]
40
61ee50abf05e Add error handling for unknown (or currently unhandled) file types.
Danek Duvall <danek.duvall@sun.com>
parents: 38
diff changeset
   142
                        else:
61ee50abf05e Add error handling for unknown (or currently unhandled) file types.
Danek Duvall <danek.duvall@sun.com>
parents: 38
diff changeset
   143
                                path = "<unknown path>"
61ee50abf05e Add error handling for unknown (or currently unhandled) file types.
Danek Duvall <danek.duvall@sun.com>
parents: 38
diff changeset
   144
                        raise TypeError("%s: unknown file type '%s'" %
61ee50abf05e Add error handling for unknown (or currently unhandled) file types.
Danek Duvall <danek.duvall@sun.com>
parents: 38
diff changeset
   145
                                (path, type))
38
52e6547130fa add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents: 33
diff changeset
   146
52e6547130fa add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents: 33
diff changeset
   147
                repo = config.install_uri
52e6547130fa add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents: 33
diff changeset
   148
                uri_exp = urlparse.urlparse(repo)
52e6547130fa add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents: 33
diff changeset
   149
                host, port = uri_exp[1].split(":")
52e6547130fa add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents: 33
diff changeset
   150
                selector = "/add/%s/%s" % (trans_id, type)
52e6547130fa add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents: 33
diff changeset
   151
49
c3a70bdc4527 First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents: 44
diff changeset
   152
                # XXX Need to handle large files
51
d04d55e16d0b Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents: 49
diff changeset
   153
                if action.data != None:
d04d55e16d0b Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents: 49
diff changeset
   154
                        datastream = action.data()
49
c3a70bdc4527 First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents: 44
diff changeset
   155
                        data = datastream.read()
51
d04d55e16d0b Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents: 49
diff changeset
   156
                else:
d04d55e16d0b Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents: 49
diff changeset
   157
                        data = ""
28
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   158
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   159
                c = httplib.HTTPConnection(host, port)
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   160
                c.connect()
102
613f3d9bef66 Implement chattr token for importer and use it on a couple of files.
Danek Duvall <danek.duvall@sun.com>
parents: 57
diff changeset
   161
                c.putrequest("POST", selector)
613f3d9bef66 Implement chattr token for importer and use it on a couple of files.
Danek Duvall <danek.duvall@sun.com>
parents: 57
diff changeset
   162
                for k in attrs:
613f3d9bef66 Implement chattr token for importer and use it on a couple of files.
Danek Duvall <danek.duvall@sun.com>
parents: 57
diff changeset
   163
                        c.putheader("X-IPkg-SetAttr", "%s=%s" % (k, attrs[k]))
613f3d9bef66 Implement chattr token for importer and use it on a couple of files.
Danek Duvall <danek.duvall@sun.com>
parents: 57
diff changeset
   164
                c.putheader("Content-Length", len(data))
613f3d9bef66 Implement chattr token for importer and use it on a couple of files.
Danek Duvall <danek.duvall@sun.com>
parents: 57
diff changeset
   165
                c.endheaders()
613f3d9bef66 Implement chattr token for importer and use it on a couple of files.
Danek Duvall <danek.duvall@sun.com>
parents: 57
diff changeset
   166
                c.send(data)
28
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   167
51
d04d55e16d0b Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents: 49
diff changeset
   168
                try:
d04d55e16d0b Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents: 49
diff changeset
   169
                        r = c.getresponse()
d04d55e16d0b Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents: 49
diff changeset
   170
                except httplib.BadStatusLine:
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 102
diff changeset
   171
                        print "Server-side exception for '%s'" % action
51
d04d55e16d0b Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents: 49
diff changeset
   172
                        return 500
28
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   173
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   174
                return r.status
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   175
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   176
        def meta(self, config, trans_id, args):
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   177
                """Via POST request, transfer a piece of metadata to the server.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   178
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   179
                XXX This is just a stub.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   180
                """
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   181
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   182
                repo = config.install_uri
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   183
                uri_exp = urlparse.urlparse(repo)
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   184
                host, port = uri_exp[1].split(":")
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   185
                selector = "/meta/%s/%s" % (trans_id, args[0])
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   186
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   187
                # subcommand handling
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   188
                # /meta/trans_id/set/property_name
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   189
                #       Payload is value.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   190
                # /meta/trans_id/unset/property_name
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   191
                #       No payload.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   192
                # /meta/trans_id/include
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   193
                # /meta/trans_id/require
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   194
                # /meta/trans_id/exclude
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   195
                #       Payload is fmri.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   196
                # /meta/trans_id/disclaim
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   197
                #       Payload is fmri.
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   198
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   199
                headers = {}
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   200
                headers["Path"] = args[1]
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   201
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   202
                c = httplib.HTTPConnection(host, port)
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   203
                c.connect()
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   204
                c.request("POST", selector, data, headers)
69ad5b247616 Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff changeset
   205
                return