#!/usr/bin/env python
# vim: tabstop=4 shiftwidth=4 softtabstop=4

# Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.

"""
  Download images from Canonical Image Store
"""

import gettext
import json
import os
import tempfile
import shutil
import subprocess
import sys
import urllib2

# If ../nova/__init__.py exists, add ../ to Python search path, so that
# it will override what happens to be installed in /usr/(local/)lib/python...
possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
                                   os.pardir,
                                   os.pardir))
if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
    sys.path.insert(0, possible_topdir)

gettext.install('nova', unicode=1)

from nova import flags
from nova import log as logging
from nova import utils
from nova.objectstore import image

FLAGS = flags.FLAGS

API_URL = 'https://imagestore.canonical.com/api/dashboard'


def get_images():
    """Get a list of the images from the imagestore URL."""
    images = json.load(urllib2.urlopen(API_URL))['images']
    images = [img for img in images if img['title'].find('amd64') > -1]
    return images


def download(img):
    """Download an image to the local filesystem."""
    # FIXME(ja): add checksum/signature checks
    tempdir = tempfile.mkdtemp(prefix='cis-')

    kernel_id = None
    ramdisk_id = None

    for f in img['files']:
        if f['kind'] == 'kernel':
            dest = os.path.join(tempdir, 'kernel')
            subprocess.call(['curl', '--fail', f['url'], '-o', dest])
            kernel_id = image.Image.add(dest,
                description='kernel/' + img['title'], kernel=True)

    for f in img['files']:
        if f['kind'] == 'ramdisk':
            dest = os.path.join(tempdir, 'ramdisk')
            subprocess.call(['curl', '--fail', f['url'], '-o', dest])
            ramdisk_id = image.Image.add(dest,
                description='ramdisk/' + img['title'], ramdisk=True)

    for f in img['files']:
        if f['kind'] == 'image':
            dest = os.path.join(tempdir, 'image')
            subprocess.call(['curl', '--fail', f['url'], '-o', dest])
            ramdisk_id = image.Image.add(dest,
                description=img['title'], kernel=kernel_id, ramdisk=ramdisk_id)

    shutil.rmtree(tempdir)


def main():
    """Main entry point."""
    utils.default_flagfile()
    argv = FLAGS(sys.argv)
    logging.setup()
    images = get_images()

    if len(argv) == 2:
        for img in images:
            if argv[1] == 'all' or argv[1] == img['title']:
                download(img)
    else:
        print 'usage: %s (title|all)'
        print 'available images:'
        for img in images:
            print img['title']

if __name__ == '__main__':
    main()
