Package backend :: Package server :: Package importlib :: Module packageUpload
[hide private]
[frames] | no frames]

Source Code for Module backend.server.importlib.packageUpload

  1  # 
  2  # Copyright (c) 2008--2016 Red Hat, Inc. 
  3  # 
  4  # This software is licensed to you under the GNU General Public License, 
  5  # version 2 (GPLv2). There is NO WARRANTY for this software, express or 
  6  # implied, including the implied warranties of MERCHANTABILITY or FITNESS 
  7  # FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 
  8  # along with this software; if not, see 
  9  # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. 
 10  # 
 11  # Red Hat trademarks are not licensed under GPLv2. No permission is 
 12  # granted to use or replicate Red Hat trademarks that are incorporated 
 13  # in this software or its documentation. 
 14  # 
 15  # 
 16  # Package import code on the app side 
 17  # 
 18   
 19  from spacewalk.common import rhn_rpm 
 20  from spacewalk.common.rhnLog import log_debug 
 21  from spacewalk.common.rhnException import rhnFault 
 22   
 23  from spacewalk.server import rhnChannel, taskomatic, rhnSQL 
 24  from spacewalk.server.importlib.backendOracle import SQLBackend 
 25  from spacewalk.server.importlib.headerSource import createPackage 
 26  from spacewalk.server.importlib.importLib import Collection 
 27  from spacewalk.server.importlib.packageImport import packageImporter 
 28  from spacewalk.server.importlib.errataCache import schedule_errata_cache_update 
 29   
 30   
31 -def uploadPackages(info, source=0, force=0, caller=None):
32 log_debug(4, source, force, caller) 33 batch = Collection() 34 packageList = info.get("packages") or [] 35 if not packageList: 36 raise Exception("Nothing to do") 37 38 org_id = info.get('orgId') 39 if org_id == '': 40 org_id = None 41 42 if source: 43 channelList = [] 44 else: 45 channelList = info.get("channels") or [] 46 47 for package in packageList: 48 p = __processPackage(package, org_id, channelList, source) 49 batch.append(p) 50 51 backend = SQLBackend() 52 importer = packageImporter(batch, backend, source, caller=caller) 53 54 importer.setUploadForce(force) 55 56 importer.run() 57 if not source: 58 importer.subscribeToChannels() 59 60 # Split the result in two lists - already uploaded and new packages 61 newpkgs = [] 62 uploaded = [] 63 for pkg in importer.status(): 64 if pkg.ignored or pkg.diff: 65 uploaded.append(pkg) 66 else: 67 newpkgs.append(pkg) 68 69 # Schedule an errata cache update only if we touched the channels 70 if not source: 71 # makes sense only for binary packages 72 schedule_errata_cache_update(importer.affected_channels) 73 taskomatic.add_to_repodata_queue_for_channel_package_subscription( 74 importer.affected_channels, batch, caller) 75 rhnSQL.commit() 76 77 return _formatStatus(uploaded), _formatStatus(newpkgs)
78 79
80 -def __processPackage(package, org_id, channels, source):
81 log_debug(4, org_id, channels, source) 82 if 'md5sum' in package: # for old rhnpush compatibility 83 package['checksum_type'] = 'md5' 84 package['checksum'] = package['md5sum'] 85 del(package['md5sum']) 86 87 if 'checksum' not in package: 88 raise rhnFault(50, "The package's checksum digest has not been specified") 89 if 'packageSize' not in package: 90 raise rhnFault(50, "The package size has not been specified") 91 92 header = rhn_rpm.headerLoad(package['header'].data) 93 if not header: 94 raise rhnFault(50) 95 packageSize = package['packageSize'] 96 relpath = package.get('relativePath') 97 98 if 'header_start' in package: 99 header_start = package['header_start'] 100 else: 101 header_start = 0 102 if 'header_end' in package: 103 header_end = package['header_end'] 104 else: 105 # Just say the whole package 106 header_end = packageSize 107 108 checksum_type = package['checksum_type'] 109 checksum = package['checksum'] 110 p = createPackage(header, packageSize, checksum_type, checksum, relpath, org_id, 111 header_start, header_end, channels) 112 return p
113 114
115 -def _formatStatus(status):
116 objlist = [] 117 for pkg in status: 118 name = pkg.name 119 epoch = pkg.evr[0] 120 if epoch is None: 121 epoch = "" 122 else: 123 epoch = str(epoch) 124 version = pkg.evr[1] 125 release = pkg.evr[2] 126 arch = pkg.arch 127 hash = {} 128 ignored = pkg.ignored 129 if ignored is None: 130 ignored = 0 131 hash['ignored'] = ignored 132 hash['diff'] = _dump(pkg.diff) 133 objlist.append([name, version, release, epoch, arch, hash]) 134 return objlist
135 136
137 -def _dump(object):
138 if object is None: 139 return '' 140 from spacewalk.common.usix import IntType, StringType, FloatType 141 if type(object) in (IntType, StringType, FloatType): 142 return object 143 from spacewalk.common.usix import ListType 144 if isinstance(object, ListType): 145 return list(map(_dump, object)) 146 from spacewalk.common.usix import TupleType 147 if isinstance(object, TupleType): 148 return tuple(map(_dump, object)) 149 from spacewalk.common.usix import DictType 150 if isinstance(object, DictType): 151 dict = {} 152 for h, v in object.items(): 153 dict[_dump(h)] = _dump(v) 154 return dict 155 return str(object)
156 157
158 -def listChannelsSource(channelList):
159 return _listChannels(channelList, True, False)
160 161
162 -def listChannels(channelList):
163 return _listChannels(channelList, False, False)
164 165
166 -def listChannelsChecksum(channelList):
167 return _listChannels(channelList, False, True)
168 169
170 -def _listChannels(channelList, is_source, include_checksums):
171 # Lists the packages from these channels 172 # Uniquify the channels 173 channels = set(channelList) 174 rez = [] 175 for channel in channels: 176 c_info = rhnChannel.channel_info(channel) 177 if not c_info: 178 # No packages in this channel 179 continue 180 181 if is_source: 182 packageList = rhnChannel.list_packages_source(c_info['id']) 183 else: 184 if include_checksums: 185 packageList = rhnChannel.list_packages_checksum_sql( 186 c_info['id']) 187 else: 188 packageList = rhnChannel.list_packages_sql(c_info['id']) 189 for p in packageList: 190 if is_source: 191 for pkg in range(len(p)): 192 if p[pkg] is None: 193 p[pkg] = "" 194 print(p) 195 rez.append([p[0], p[1], p[2], p[3], channel]) 196 else: 197 if include_checksums: 198 rez.append([p[0], p[1], p[2], p[3], p[4], p[6], p[7], 199 channel]) 200 else: 201 rez.append([p[0], p[1], p[2], p[3], p[4], channel]) 202 return rez
203