#!/usr/bin/env python
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.

#
# This example provides both a running script (invoke from command line)
# and an importable module one can play with in Interactive Mode.
#
# See docstrings for usage examples.
#

try:
    import secrets
except:
    pass
import sys; sys.path.append('..')

from libcloud.compute.types import Provider
from libcloud.providers import get_driver

from pprint import pprint

def main(argv):
    """Main EC2 Demo

    When invoked from the command line, it will connect using secrets.py
    (see secrets.py.dist for setup instructions), and perform the following
    tasks:

    - List current nodes
    - List available images (up to 10)
    - List available sizes (up to 10)
    """
    # Load EC2 driver
    EC2Driver = get_driver(Provider.EC2_US_EAST)

    # Instantiate with Access ID and Secret Key
    # (see secrets.py.dist)
    try:
        ec2 = EC2Driver(secrets.EC2_ACCESS_ID, secrets.EC2_SECRET_KEY)
        print ">> Loading nodes..."
        nodes = ec2.list_nodes()
        pprint(nodes)
    except NameError, e:
        print ">> Fatal Error: %s" % e
        print "   (Hint: modify secrets.py.dist)"
        return 1
    except Exception, e:
        print ">> Fatal error: %s" % e
        return 1
    
    print ">> Loading images... (showing up to 10)"
    images = ec2.list_images()
    pprint(images[:10])

    print ">> Loading sizes... (showing up to 10)"
    sizes = ec2.list_sizes()
    pprint(sizes[:10])

    return 0

def get_ec2(**kwargs):
    """An easy way to play with the EC2 Driver in Interactive Mode

    # Load credentials from secrets.py
    >>> from ec2demo import get_ec2
    >>> ec2 = get_ec2()

    # Or, provide credentials
    >>> from ec2demo import get_ec2
    >>> ec2 = get_ec2(access_id='xxx', secret_key='yyy')

    # Do things
    >>> ec2.load_nodes()
    >>> images = ec2.load_images()
    >>> sizes = ec2.load_sizes()
    """
    access_id = kwargs.get('access_id', secrets.EC2_ACCESS_ID)
    secret_key = kwargs.get('secret_key', secrets.EC2_SECRET_KEY)
    
    EC2Driver = get_driver(Provider.EC2_US_EAST)
    return EC2Driver(access_id, secret_key)

def create_demo(ec2):
    """Create EC2 Node Demo

    >>> from ec2demo import get_ec2, create_demo
    >>> ec2 = get_ec2()
    >>> node = create_demo(ec2)
    >>> node
    <Node: uuid=9d1..., name=i-7b1fa910, state=3, public_ip=[''], ...>

    And to destroy the node:

    >>> node.destroy()

    If you've accidentally quit and need to destroy the node:

    >>> from ec2demo import get_ec2
    >>> nodes = ec2.list_nodes()
    >>> nodes[0].destroy() # assuming it's the first node
    """
    images = ec2.list_images()
    image = [image for image in images if 'ami' in image.id][0]
    sizes = ec2.list_sizes()
    size = sizes[0]

    # Note, name is ignored by EC2
    node = ec2.create_node(name='create_image_demo',
                           image=image,
                           size=size)
    return node

if __name__ == '__main__':
    sys.exit(main(sys.argv))
