/cobaltclient

Gridcentric OpenStack client extension.

Primary LanguagePython

Overview
========

An extension hook for novaclient that enables it to interact with the Cobalt endpoints.

Command line usage
==================

After installing the operations provided by the Cobalt extension will be available to the 
nova command line application:

    # Display all of the available commands of the nova script. The gridcentric live-image-create,
    # live-image-start, live-image-list, live-image-servers, live-image-delete and co-migrate
    # are listed.
    $ nova help
    
    # Doing nova help <command> on any of these commands will display how to use them in detail.
    $ nova help live-image-create
    usage: nova live-image-create [--name <name>] <instance>

    Creates a new live-image from a running instance.

    Positional arguments:
      <instance>     ID or name of the instance from which to create the live-
                     image

    Optional arguments:
      --name <name>  The name of the live-image

    
    $ nova help live-image-start
    usage: nova live-image-start [--target <target memory>]
                                 [--name <instance name>]
                                 [--user_data <user-data>]
                                 [--security-groups <security groups>]
                                 [--availability-zone <availability zone>]
                                 [--num-instances <number>]
                                 [--key-name <key name>] [--params <key=value>]
                                 <live image>

    Start a new instance from a live-image.

    Positional arguments:
      <live image>          ID or name of the live-image

    Optional arguments:
      --target <target memory>
                            The memory target of the launched instance
      --name <instance name>
                            The name of the launched instance
      --user_data <user-data>
                            User data file to pass to be exposed by the metadata
                            server
      --security-groups <security groups>
                            comma separated list of security group names.
      --availability-zone <availability zone>
                            The availability zone for instance placement.
      --num-instances <number>
                            Launch multiple instances at a time
      --key-name <key name>
                            Key name of keypair that should be created earlier
                            with the command keypair-add
      --params <key=value>  Guest parameters to send to vms-agent


    $ nova help live-image-delete
    usage: nova live-image-delete <live-image>

    Delete a live image.

    Positional arguments:
      <live-image>  ID or name of the live-image

    
    $ nova help co-migrate
    usage: nova co-migrate [--dest <destination host>] <instance>

    Migrate an instance using VMS.

    Positional arguments:
      <instance>            ID or name of the instance to migrate

    Optional arguments:
      --dest <destination host>
                            Host to migrate to

    
   $ nova help live-image-servers
   usage: nova live-image-servers <live-image>

   List instances started from this live-image.

   Positional arguments:
     <live-image>  ID or name of the live-image

    
    $ nova help live-image-list
    usage: nova live-image-list <server>

    List the live images of this instance.

    Positional arguments:
      <server>  ID or name of the instance

    

Scripting usage
===============

The novaclient hooks can also be accessed directly using the python API.

    user = "admin"
    apikey = "admin"
    project = "openstackDemo"
    authurl = "http://localhost:5000/v2.0" 
    
    extensions = shell.OpenStackComputeShell()._discover_extensions("1.1")
    novaclient = NovaClient(user, apikey, project, authurl, extensions=extensions,
                            endpoint_type=shell.DEFAULT_NOVA_ENDPOINT_TYPE,
                            service_type=shell.DEFAULT_NOVA_SERVICE_TYPE)
    
    def wait_for_status(server, status):
        while server.status != status:
            time.sleep(30)
            server = novaclient.cobalt.get(server.id)
        return server

    def wait_until_gone(server):
        try:
            while True:
                server = novaclient.cobalt.get(server.id)
                time.sleep(10)
        except Exception, e:
            # server is no longer there.
            pass

    # Boot a new server using flavor 1 and the image passed in as the first argument.
    image_id = sys.argv[1]
    flavor_id = 1
    server = novaclient.servers.create("Gridcentric instance",
                                  image_id,
                                  flavor_id)
    server = wait_for_status(server, "ACTIVE")
    
    # Create a live image of the server. This will return an instance of the blessed_server. We need to
    # wait until the live image becomes active.
    live_image = novaclient.cobalt.live_image_create(server)[0]
    live_image = wait_for_status(live_image, "BLESSED")
    
    # Launch a new server based off of the live iamge. Note that we can do this
    # by either calling start_live_image on the server itself, or passing the server into the
    # cobalt manager.
    launched_server = live_image.start_live_image()[0]
    launched_server2 = novaclient.cobalt.start_live_image(live_image)[0]
    
    # list the servers that were launched from the live_image.
    for s in live_image.list_servers():
        print "Server %s was launched from %s" %(s.id, live_image.id)
        
    # Delete the launched servers.
    launched_server2 = wait_for_status(launched_server2, "ACTIVE")
    launched_server2.delete()
    launched_server = wait_for_status(launched_server, "ACTIVE")
    novaclient.servers.delete(launched_server)

    # W need to ensure that the launched instances have been deleted before deleting
    # the live image.
    wait_until_gone(launched_server2)
    wait_until_gone(launched_server)

    # Delete the original server. Note we can delete this server
    # and keep the blessed one around.
    server.delete()

    # Discard the blessed server
    live_image.delete_live_image()