def checkOptions(self):
        if len(self.args) != 1:
            self.parser.error('Please specify an image manifest')
        self.manifest = self.args[0]

        Uploader.checkUploadOptions(self.options, self.parser)

        if not os.path.isfile(self.manifest):
            self.parser.error('Image manifest does not exist: ' + self.manifest)
    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)
    def parse(self):
        Uploader.buildUploadParser(self.parser)

        self.parser.usage = '''%prog [options] metadata-file'''

        self.parser.description = '''
Uploads metadata about a machine or disk image to the Marketplace.
The metadata-file argument is the signed metadata file to upload.
'''

        self.options, self.args = self.parser.parse_args()
Example #4
0
    def __init__(self, configHolder=ConfigHolder()):
        self.configHolder = configHolder

        configHolder.assign(self)

        self.uploader = Uploader(configHolder)
        self.manifestDownloader = ManifestDownloader(configHolder)
Example #5
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
Example #6
0
 def _uploadMarketplaceManifest(self):
     uploader = MarketplaceUploader(self.configHolder)
     url = uploader.upload(self.manifestFile)
     Util.printInfo('Manifest uploaded: %s' % url)