def destroy_VM_instance(settings, ip_address):
    """
        Terminate a VM instance
    """
    print("Terminating VM instance %s" % ip_address)
    if _is_instance_running(settings, ip_address, ip_given=True):
        try:
            if not confirm_teardown():
                return
            instance = get_this_instance(settings, ip_address,
                ip_given=True)
            instance_id = instance.id
            ip_address = get_instance_ip(instance)
            delete_chef_node_client(settings, instance_id, ip_address)
            connection = create_cloud_connection(settings)
            connection.terminate_instances([instance_id])
            _wait_for_instance_to_terminate(settings, ip_address)
        except Exception:
            traceback.print_exc(file=sys.stdout)
            raise
    else:
        print "VM instance with IP %s doesn't exist" % ip_address
def destroy_VM_instance(settings, connection, ip_address):
    """
        Terminate
            - all instances, or
            - a group of instances, or
            - a single instance
    """
    print("Terminating VM instance %s" % ip_address)
    if _is_instance_running(connection, ip_address):
        try:
            instance = get_this_instance(connection, ip_address, ip_given=True)
            if not confirm_teardown(settings):
                return
            instance_id = instance.id
            ip_address = instance.public_ips[0]
            delete_chef_node_client(settings, instance_id, ip_address)
            connection.destroy_node(instance)
            _wait_for_instance_to_terminate(settings, connection, ip_address)
        except Exception:
            traceback.print_exc(file=sys.stdout)
            raise
    else:
        print "VM instance with IP %s doesn't exist" % ip_address