Пример #1
0
    def doWork(self):
        configHolder = ConfigHolder(self.options.__dict__)
        uploader = Uploader(configHolder)

        try:
            url = uploader.upload(self.manifest)
            print url
        except InputException, e:
            print e
            sys.exit(1)
Пример #2
0
class Deprecator(object):

    @staticmethod
    def buildDeprecatorParser(parser):
        parser.usage = '''usage: %prog [options] image-id'''

        parser.description = '''
Create a new metadata entry for the given image that deprecates the
image.  The reason for the deprecation must be given. The image-id
argument is the identifier of the image to deprecate.
'''

        MarketplaceUtil.addEndpointOption(parser)
        P12Certificate.addOptions(parser)

        parser.add_option('--email', dest='email',
                help='email address of endorser of metadata entry',
                default='')

        parser.add_option('--created', dest='created',
                help='date of metadata entry to be deprecated, latest entry will be deprecated if not provided',
                default='')

        parser.add_option('--reason', dest='reason',
                help='Comment to append to deprecation',
                default='This image has been deprecated', metavar='TEXT')

    @staticmethod
    def checkDeprecatorOptions(options, parser):
        MarketplaceUtil.checkEndpointOption(options)

        if not P12Certificate.checkOptions(options):
            parser.error('Missing credentials. Please provide %s' % P12Certificate.optionString)

        if not options.email:
            parser.error('Missing email address. Please provide email of endorser')

    def __init__(self, configHolder=ConfigHolder()):
        self.configHolder = configHolder

        configHolder.assign(self)

        self.uploader = Uploader(configHolder)
        self.manifestDownloader = ManifestDownloader(configHolder)

    def deprecate(self, imageId):
        tempDeprecatedMetadataFilename = tempfile.mktemp()
        tempMetadataFilename = tempfile.mktemp()
        try:
            imageURI = imageId + '/' + self.email
            if len(self.created) != 0:
                imageURI = imageURI + '/' + self.created

            # Get metadata file
            self.manifestDownloader.getManifestAsFile(imageURI, tempMetadataFilename)

            # Strip signature
            xml = etree.ElementTree(file=tempMetadataFilename)
            root = xml.getroot()

            if (root.tag == "metadata"):
                rootElement = root.find('.//{%s}RDF' % ManifestInfo.NS_RDF)
            else:
                rootElement = root

            descriptionElement = rootElement.find('.//{%s}Description' % ManifestInfo.NS_RDF)
            descriptionElement.remove(descriptionElement.find('.//{%s}endorsement' % ManifestInfo.NS_SLREQ))
            endorsement = etree.Element('{%s}%s' % (ManifestInfo.NS_SLREQ, 'endorsement'), parseType="Resource")
            descriptionElement.append(endorsement)

            signatureElement = rootElement.find('.//{%s}Signature' % 'http://www.w3.org/2000/09/xmldsig#')
            rootElement.remove(signatureElement)

            xml._setroot(rootElement)

            # Add deprecated entry
            elem = etree.Element('{%s}%s' % (ManifestInfo.NS_SLTERMS, 'deprecated'))
            elem.text = self.reason
            descriptionElement.append(elem)

            xml.write(tempDeprecatedMetadataFilename)

            # Sign and upload
            signator = Signator(tempDeprecatedMetadataFilename, self.configHolder)

            isError = signator.sign()
            if isError:
                raise ExecutionException('Error signing new manifest')

            return self.uploader.upload(tempDeprecatedMetadataFilename)
        finally:
            try:
                os.unlink(tempMetadataFilename)
                os.unlink(tempDeprecatedMetadataFilename)
                os.unlink(tempDeprecatedMetadataFilename+'.orig')
            except:
                pass
Пример #3
0
 def _uploadMarketplaceManifest(self):
     uploader = MarketplaceUploader(self.configHolder)
     url = uploader.upload(self.manifestFile)
     Util.printInfo('Manifest uploaded: %s' % url)