Add some documentation for cluster management
[kamaki] / docs / usage.rst
index 6612041..7d852cf 100644 (file)
 Usage
 =====
 
-Kamaki offers two command line interfaces: an one-command tool and an interactive shell. Both systems implement the exact same command specifications. A detailed list of the command specifications can be found in `Commands <commands.html>`_ section. This guide covers the generic usage of both interfaces.
+Kamaki offers command-line interfaces that implement specific command
+specifications. A detailed list of the command specifications can be found in
+`Commands <commands.html>`_ section. This guide covers the generic usage of
+both interfaces.
 
-What's more, kamaki offers a clients API that allows the developement of external applications for synnefo. The clients API is listed in the `Clients lib <clients.html>`_ section. The recomended method of utilizing this API is explained in the present.
+What's more, kamaki offers a clients library for the development of external
+client applications for Synnefo. The clients library API is detailed in the
+`Clients lib <developers/code.html#the-clients-api>`_ section.
 
-Setup
------
+Quick Setup
+-----------
 
-Kamaki interfaces rely on a list of configuration options. In the initial state, kamaki is configured to communicate with the Okenos IaaS. A detailed guide for setting up kamaki can be found in the `Setup <setup.rst>`_ section.
+Kamaki interfaces rely on a list of configuration options. A detailed guide for
+setting up kamaki can be found in the `Setup <setup.html>`_ section.
 
-Quick guide
-^^^^^^^^^^^
-
-It is essential for users to get a configuration token (to get in Okeanos.grnet.gr log `here <https://accounts.okeanos.grnet.gr/im/>`_) and provide it to kamaki:
+As rule of the thump, it is enough to set the authentication URL and user token
+for the cloud kamaki should communicate with by default:
 
 .. code-block:: console
+    :emphasize-lines: 1
 
-    $ kamaki set token myt0k3n==
+    Example 1.1: Set authentication URL, user token and cloud alias "default"
 
+    $ kamaki config set cloud.default.url <authentication URL>
+    $ kamaki config set cloud.default.token myt0k3n==
 
-    Example 1.1.1: Set user token to myt0k3n==
+.. note:: The term *default* can be replaced by any arbitary term chosen by
+    the user. This term will serve as a cloud alias for kamaki users, and can
+    be easily modified.
 
-To use the storage service, a user should also provide the username:
+Shell vs one-command
+--------------------
+Kamaki users can access Synnefo services through either the interactive shell
+or the one-command interface. In practice, both systems rely on the same
+command set implementations and API clients, with identical responses and error
+messages. Still, there are some differences.
 
-.. code-block:: console
+In favor of interactive shell:
 
-    $ kamaki set account user@domain.com
+* tab completion for commands (if supported by the user shell)
+* session history with ↑ or ↓ keys (if supported by the user shell)
+* shorter commands with command context switching
+* re-run old commands with /history
 
+In favor of one-command:
 
-    Example 1.1.2: Set user name to user@domain.com
+* can be used along with advanced shell features (pipelines, redirection, etc.)
+* can be used in shell scripts
+* prints debug and verbose messages if needed
 
 Run as shell
-""""""""""""
-Call kamaki
+^^^^^^^^^^^^
+To use kamaki as a shell, run:
 
 * without any parameters or arguments
 
 .. code-block:: console
+    :emphasize-lines: 1
 
-    $ kamaki
-
-
-    Example 1.2.1: Running kamaki shell
+    Example 2.2.1: Run kamaki shell
 
+    $ kamaki
 
-* with any kind of '-' prefixed arguments, except '-h', '--help'.
+* with any kind of '-' prefixed arguments, except '-h', '--help', '-V',
+    '- - version'.
 
 .. code-block:: console
+    :emphasize-lines: 1
 
-    $ kamaki --config myconfig.file
+    Example 2.2.2: Run kamaki shell with custom configuration file
 
-   
-    Example 1.2.2: Running kamaki shell with custom configuration file
+    $ kamaki -c myconfig.file
 
 
 Run as one-command
-""""""""""""""""""
-Call kamaki:
+^^^^^^^^^^^^^^^^^^
+To use kamaki as an one-command tool, run:
 
 * with the '-h' or '--help' arguments (help for kamaki one-command)
 
 .. code-block:: console
+    :emphasize-lines: 1
 
-    $kamaki -h
-
+    Example 2.3.1: Kamaki help
 
-    Example 1.3.1: Kamaki help
+    $kamaki -h
 
 * with one or more command parameters:
 
 .. code-block:: console
+    :emphasize-lines: 1
+
+    Example 2.3.2: List servers managed by user
 
     $ kamaki server list
 
+One-command interface
+---------------------
+
+Using help
+^^^^^^^^^^
+
+Kamaki help provides information on available commands (description, syntax and
+corresponding optional arguments).
+
+To see the command groups, use -h or --help (example 1.3.1). The
+following examples demonstrate the help messages of kamaki, in the context of a
+command group (server) and of a command in that group (list).
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 3.1.1: kamaki help shows available parameters and command groups
+
+
+    $ kamaki -h
+    usage: kamaki <cmd_group> [<cmd_subbroup> ...] <cmd>
+        [-v] [-s] [-V] [-d] [-i] [-c CONFIG] [-o OPTIONS] [--cloud CLOUD] [-h]
+
+    optional arguments:
+      -v, --verbose         More info at response
+      -s, --silent          Do not output anything
+      -V, --version         Print current version
+      -d, --debug           Include debug output
+      -i, --include         Include protocol headers in the output
+      -c CONFIG, --config CONFIG
+                            Path to configuration file
+      -o OPTIONS, --options OPTIONS
+                            Override a config value
+      --cloud CLOUD         Chose a cloud to connect to
+      -h, --help            Show help message
+
+    Options:
+     - - - -
+    network: Cyclades/Compute API network commands
+    user: Astakos API commands
+    livetest: Client func. tests on live servers
+    server: Cyclades/Compute API server commands
+    project: Synnefo project management CLI
+    file: Pithos+/Storage API commands
+    flavor: Cyclades/Compute API flavor commands
+    config: Kamaki configurations
+    image: Cyclades/Plankton API image commands
+    image compute:  Cyclades/Compute API image commands
+    history: Kamaki command history
 
-    Example 1.3.2: List VMs managed by user
 
-Command parameters
-""""""""""""""""""
+.. code-block:: console
+    :emphasize-lines: 1,2
+
+    Example 3.1.2: Cyclades help contains all first-level commands of Cyclades
+    command group
+
+    $ kamaki server -h
+    usage: kamaki server <...> [-v] [-s] [-V] [-d] [-i] [-c CONFIG]
+                               [-o OPTIONS] [--cloud CLOUD] [-h]
+
+    optional arguments:
+      -v, --verbose         More info at response
+      -s, --silent          Do not output anything
+      -V, --version         Print current version
+      -d, --debug           Include debug output
+      -i, --include         Include protocol headers in the output
+      -c CONFIG, --config CONFIG
+                            Path to configuration file
+      -o OPTIONS, --options OPTIONS
+                            Override a config value
+      --cloud CLOUD         Chose a cloud to connect to
+      -h, --help            Show help message
+
+    Options:
+     - - - -
+    info: Detailed information on a Virtual Machine
+    rename: Set/update a virtual server name
+    delete: Delete a virtual server
+    console: Get a VNC console to access an existing virtual server
+    addr: List the addresses of all network interfaces on a virtual server
+    firewall: Manage virtual server firewall profiles for public networks
+    create: Create a server (aka Virtual Machine)
+    list: List Virtual Machines accessible by user
+    reboot: Reboot a virtual server
+    start: Start an existing virtual server
+    shutdown: Shutdown an active virtual server
+    stats: Get virtual server statistics
+    metadata: Manage Server metadata (key:value pairs of server attributes)
+    resize: Set a different flavor for an existing server
+    wait: Wait for server to finish [BUILD, STOPPED, REBOOT, ACTIVE]
 
-Typically, commands consist of a group name (e.g. store for storage commands) one or more terms (e.g. list for listing) and the command specific parameters (e.g. the name of the container), if any.
+.. code-block:: console
+    :emphasize-lines: 1,2
+
+    Example 3.1.3: Help for command "server list" with syntax, description and
+    available user options
+
+    $ kamaki server list -h
+    usage: kamaki server list [-v] [-s] [-V] [-d] [-i] [-c CONFIG] [-o OPTIONS]
+                              [--cloud CLOUD] [-h] [--since SINCE] [--enumerate]
+                              [-l] [--more] [-n LIMIT] [-j]
+
+    List Virtual Machines accessible by user
+
+    optional arguments:
+      -v, --verbose         More info at response
+      -s, --silent          Do not output anything
+      -V, --version         Print current version
+      -d, --debug           Include debug output
+      -i, --include         Include raw connection data in the output
+      -c CONFIG, --config CONFIG
+                            Path to config file
+      -o OPTIONS, --options OPTIONS
+                            Override a config value
+      --cloud CLOUD         Chose a cloud to connect to
+      -h, --help            Show help message
+      --status STATUS       filter by status (ACTIVE, STOPPED, REBOOT, ERROR,
+                            etc.)
+      --enumerate           Enumerate results
+      --name-suffix NAME_SUFF
+                            filter by name suffix (case insensitive)
+      --image-id IMAGE_ID   filter by image id
+      --metadata META       filter by metadata key=values
+      -j, --json            show headers in json
+      --id ID               filter by id
+      --user-id USER_ID     filter by user id
+      --id-like ID_LIKE     print only if id contains this (case insensitive)
+      --id-suffix ID_SUFF   filter by id suffix (case insensitive)
+      --since SINCE         show only items since date (' d/m/Y H:M:S ')
+      -l, --details         show detailed output
+      --name NAME           filter by name
+      --more                output results in pages (-n to set items per page,
+                            default 10)
+      --name-prefix NAME_PREF
+                            filter by name prefix (case insensitive)
+      -n LIMIT, --number LIMIT
+                            limit number of listed virtual servers
+      --id-prefix ID_PREF   filter by id prefix (case insensitive)
+      --user-name USER_NAME
+                            filter by user name
+      --name-like NAME_LIKE
+                            print only if name contains this (case insensitive)
+      --metadata-like META_LIKE
+                            print only if in key=value, the value is part of
+                            actual value
+      --flavor-id FLAVOR_ID
+                            filter by flavor id
+
+    Details:
+    Use filtering arguments (e.g., --name-like) to manage long server lists
+
+.. _using-history-ref:
+
+Using history
+^^^^^^^^^^^^^
+
+Kamaki command history is stored in a file at user home (".kamaki.history" by default). To set a custom history file path users must set the history.file config option (see `available config options <setup.html#editing-options>`_).
+
+Every command is appended at the end of that file. In order to see how to use
+history, use the kamaki help system:
 
 .. code-block:: console
+    :emphasize-lines: 1
 
-    $ kamaki store list mycontainer
+    Example 3.2.1: Available history options
 
 
-    Example 1.4.1: List stored files in container mycontainer
+    $ kamaki history -h
+    Options:
+     - - - -
+    clean:  Clean up history (permanent)
+    run  :  Run previously executed command(s)
+    show :  Show intersession command history
 
-E.g. in example 1.3.2, the group is "server", the command is "list" and there are no parameters. Example 6 is another example using the "server" command group.
+The following example showcases how to use history in kamaki
 
 .. code-block:: console
+    :emphasize-lines: 1
 
-    $ kamaki server info 42
+    Example 3.2.2: Clean up everything, run a kamaki command, show full and filtered history
+    
 
+    $ kamaki history clean
+    $ kamaki server list
+    ...
+    $ kamaki history show
+    1.  kamaki server list
+    2.  kamaki history show
+    $ kamaki history show --match server
+    1. kamaki server list
+    3. kamaki history show --match server
 
-    Example 1.4.2: Show information about a user-managed VM with id 42
+Debug and logging
+^^^^^^^^^^^^^^^^^
 
-One-command interface
----------------------
+Debug
+"""""
+
+When in debug mode, kamaki outputs some useful debug information (stack trace
+and http logs). Kamaki in debug mode cancels suppression of warning messages.
+
+To run kamaki in debug mode use the -d or --debug option.
+
+
+Verbose
+"""""""
+
+Most kamaki commands are translated into http requests. Kamaki clients API
+translated the semantics to REST and handles the response. Users who need to
+have access to these commands can use the verbose mode that presents the HTTP
+Request details as well as the full server response.
+
+To run kamaki in verbose mode use the *-v/- - verbose* option
+
+Verbose mode outputs the request and response mode, address and
+headers as well as the size of the data block, if any. Sensitive information
+(x-auth-token header and data body) are omitted by default,. Users who need
+this information may enable it through the log_token and log_data configuration
+options (see next section)
+
+.. tip:: Use the -o runtime option to enable config options on the fly, e.g, to
+    include http data:
+
+    .. code-block:: console
+
+        $ kamaki server list -v -o log_data=on
+
+
+Logging
+"""""""
+
+Kamaki keeps its logs in a file specified by the *log_file* option and it
+defaults to *${HOME}/.kamaki.log*. This configuration option can be modified::
+
+    kamaki config set log_file /new/log/file/path
+
+Kamaki logs http request and response information, namely the method, URL,
+headers and data size. Sensitive information (data and token header) are
+omitted by default. There are some configuration options that can switch them
+on, though:
+
+* HTTP data blocks are not logged by default
+    to enable logging the full http bodies, set log_data to `on`::
+
+        kamaki config set log_data on
+
+    to disable it, set it to `off`::
+
+        kamaki config set log_data off
+
+    or delete it::
+
+        kamaki config delete log_data
+
+* X-Auth-Token header is not logged by default
+    to enable logging the X-Auth-Token header, set log_token to `on`::
+
+        kamaki config set log_token on
+
+    to disable it, set it to `off`::
+
+        kamaki config set log_token off
+
+    or delete it::
 
+        kamaki config delete log_token
+
+* The information (pid, name, date) of the processes that handle http requests
+    is not logged by default, because if they are, logs are difficult to read.
+    Still, they are useful for resolving race condition problems, so to enable
+    logging proccess information::
+
+        kamaki config set log_pid on
+
+    to disable it, set if to off::
+
+        kamaki config set log_pid off
+
+    or delete it::
+
+        kamaki config delete log_pid
+
+One-command features
+^^^^^^^^^^^^^^^^^^^^
+
+Kamaki commands can be used along with advanced shell features.
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 3.4.1: List the trash container contents, containing c1_
+    
+
+    $ kamaki file list -o cloud.default.pithos_container=trash| grep c1_
+    c1_1370859409.0 20KB
+    c1_1370859414.0 9MB
+    c1_1370859409.1 110B
+
+The -o argument can be used to temporarily override various (set or unset)
+options. In one command, all -o option sets are forgotten just after the
+command has been completed, and the previous settings are restored (the
+configuration file is not modified).
+
+The file-list command in example 3.4.1 runs with an explicitly provided
+pithos_account, which temporarily overrides the one probably provided in the
+configuration file (it works even if the user has not set the optional
+pithos_account config option).
+
+.. tip:: There are better ways to list the contents of a container. Example
+    3.4.1 is using this method for demonstration purposes only. The suggested
+    method for listing container contents is *- - container=<container>*
 
 Interactive shell
 -----------------
 
-Creating applications over the Clients API
-------------------------------------------
+Command Contexts
+^^^^^^^^^^^^^^^^
+
+The kamaki interactive shell implements the notion of command contexts. Each
+command group is also a context where the users can **enter** by typing the
+group name. If the context switch is successful, the kamaki shell prompt
+changes to present the new context ("*file*" in example 4.1.1).
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 4.1.1: Start kamaki and switch to file context
+
+
+    $ kamaki
+    [kamaki]: file
+    [file]:
+
+Type **exit** (alternatively **ctrl-D** in (X)nix systems or **ctrl-Z** in
+Windows) to exit a context and return to the context of origin. If already at
+the top context (kamaki), an exit is equivalent to exiting the program.
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 4.1.2: Exit file context and then exit kamaki
+
+    [file]: exit
+    [kamaki]: exit
+    $
+
+A user might **browse** through different contexts during one session.
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 4.1.3: Execute list command in different contexts
+
+    $ kamaki
+    [kamaki]: config
+    [config]: list
+    ... (configuration options listing) ...
+    [config]: exit
+    [kamaki]: file
+    [file]: list
+    ... (storage containers listing) ...
+    [file]: exit
+    [kamaki]: server
+    [server]: list
+    ... (servers listing) ...
+    [server]: exit
+    [kamaki]:
+
+Users have the option to avoid switching between contexts: all commands can run
+from the **top context**. As a result, examples 4.1.3 and 4.1.4 are equivalent.
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 4.1.4: Execute different "list" commands from top context
+
+
+    [kamaki]: config list
+    ... (configuration options listing) ...
+    [kamaki]: file list
+    ... (storage container listing) ...
+    [kamaki]: server list
+    ... (servers listing) ...
+    [kamaki]:
+
+Using Help
+^^^^^^^^^^
+
+There are two help mechanisms: a context-level and a command-level.
+
+**Context-level help** lists the available commands in a context and can also
+offer a short description for each command.
+
+Context-level help syntax::
+
+    * Show available commands in current context *
+    [context]: help
+    ...
+    [context]: ?
+    ...
+
+    * Show help for command cmd *
+    [context]: help cmd
+    ...
+    [context]: ?cmd
+    ...
+
+The context-level help results may change from context to context
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 4.2.1: Get available commands and then get help in a context
+
+
+    [kamaki]: help
+
+    kamaki commands:
+    ================
+    user  config  flavor  history  image  network  server  file ...
+
+    interactive shell commands:
+    ===========================
+    exit  help  shell
+
+    [kamaki]: ?config
+    Configuration commands (config -h for more options)
+
+    [kamaki]: config
+
+    [config]: ?
+
+    config commands:
+    ================
+    delete  get  list  set
+
+    interactive shell commands:
+    ===========================
+    exit  help  shell
+
+    [config]: help set
+    Set a configuration option (set -h for more options)
+
+In context-level, there is a distinction between kamaki-commands and
+interactive shell commands. The former are available in one-command mode and
+are related to the cloud client setup and use, while the later are
+context-shell functions.
+
+**Command-level help** prints the syntax, arguments and description of a
+specific (terminal) command
+
+Command-level help syntax::
+
+    * Get help for command cmd1 cmd2 ... cmdN *
+    [context]: cmd1 cmd2 ... cmdN -h
+    <syntax>
+
+    <description>
+
+    <arguments and possible extensions>
+
+Command-level help mechanism is exactly the same as the one used in
+one-command mode. For example, it is invoked by using the -h or --help
+parameter at any point.
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 4.2.2: Get command-level help for config and config-set
+
+
+    [kamaki]: config --help
+    config: Configuration commands
+    delete:  Delete a configuration option (and use the default value)
+    get   :  Show a configuration option
+    list  :  List configuration options
+    set   :  Set a configuration option
+
+    [kamaki]: config
+
+    [config]: set -h
+    usage: set <option> <value> [-v] [-d] [-h] [-i] [--config CONFIG] [-s]
+
+    Set a configuration option
+
+    optional arguments:
+      -v, --verbose    More info at response
+      -d, --debug      Include debug output
+      -h, --help       Show help message
+      -i, --include    Include protocol headers in the output
+      --config CONFIG  Path to configuration file
+      -s, --silent     Do not output anything
+
+There are many ways of producing a help message, as shown in example 4.2.3
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 4.2.3: Equivalent calls of command-level help for config-set
+
+
+    [config]: set -h
+    [config]: set --help
+    [kamaki]: config set -h
+    [kamaki]: config set --help
+    [file]: /config set -h
+    [server]: /config set --help
+
+.. _accessing-top-level-commands-ref:
+
+Accessing top-level commands
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+When working in a context, it is often useful to access other contexts or
+top-level commands. Kamaki offers access to top-level commands by using the
+`/` prefix, as shown bellow::
+
+    * access a command "anothercontext cmd1 cmd2 ... cmdN"
+    [context]: /anothercontext cmd1 cmd2 ... cmdN
+
+An example (4.3.1) that showcases how top-level access improves user experience
+is the creation of a server. A server is created with the command server-create. This
+command is called with three parameters:
+
+* the name of the new server
+* the flavor id
+* the image id
+
+An average user would enter the server context and type *create -h* to check the
+syntax of the command. In that point, it would be nice to have some easy way of
+accessing the *flavor* and *image* contexts, to list and pick a flavor id and an
+image id. This is achieved with the / notation, as demonstrated in the following
+example:
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 4.3.1: Create a server from server context
+
+    [server]: create -h
+    create <name> <flavor id> <image id> ...
+    ...
+    
+    [server]: /flavor list
+    ...
+    43 AFLAVOR
+        SNF:disk_template:  drbd
+        cpu              :  4
+        disk             :  10
+        ram              :  2048
+    
+    [server]: /image compute list
+    1580deb4-edb3-7a246c4c0528 (Ubuntu Desktop)
+    18a82962-43eb-8f8880af89d7 (Windows 7)
+    531aa018-9a40-a4bfe6a0caff (Windows XP)
+    6aa6eafd-dccb-67fe2bdde87e (Debian Desktop)
+    
+    [server]: create 'my debian' 43 6aa6eafd-dccb-67fe2bdde87e
+    ...
+
+An other example (4.3.2) showcases how to acquire and modify configuration
+settings from a different context. In this scenario, the user token expires at
+server side while the user is working. When that happens, the system responds
+with an *(401) UNAUTHORIZED* message. The user can acquire a new token (valid
+for the Astakos identity manager of preference) which has to be set to kamaki.
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 4.3.2: Token suddenly expires. Set a new token from file context
+
+
+    [file]: list
+    (401) UNAUTHORIZED Access denied
+
+    [file]: /user authenticate
+    (401) UNAUTHORIZED Invalid X-Auth-Token
+
+    [file]: /config get cloud.default.token
+    my3xp1r3dt0k3n==
+
+    [file]: /config set cloud.default.token myfr35ht0k3n==
+
+    [file]: /config get cloud.default
+    cloud.default.url = https://astakos.example.com/astakos/identity/2.0/
+    cloud.default.token = myfr35ht0k3n==
+
+    [file]: list
+    1.  pithos (10MB, 2 objects)
+    2.  trash (0B, 0 objects)
+
+.. note:: The error messages on examples are shortened for clarity. Actual error
+    messages are more helpful and descriptive.
+
+The following example compares some equivalent calls that run
+*user-authenticate* after a *file-list* 401 failure.
+
+.. code-block:: console
+    :emphasize-lines: 1,3,10,17,26
+
+    Example 4.3.3: Equivalent user-authenticate calls after a file-list 401
+
+    * I. without kamaki interactive shell *
+    $ kamaki file list
+    (401) UNAUTHORIZED Access denied
+    $ kamaki user authenticate
+    ...
+    $
+
+    * II. from top-level context *
+    [kamaki]: file list
+    (401) UNAUTHORIZED Access denied
+    [kamaki]: user authenticate
+    ...
+    [kamaki]
+
+    * III. maximum typing *
+    [file]: list
+    (401) UNAUTHORIZED Access denied
+    [file]: exit
+    [kamaki]: user
+    [user]: authenticate
+    ...
+    [user]:
+
+    * IV. minimum typing *
+    [file]: list
+    (401) UNAUTHORIZED Access denied
+    [file]: /user authenticate
+    ...
+    [file]:
+
+.. hint:: To exit kamaki shell while in a context, try */exit*
+
+Using config
+^^^^^^^^^^^^
+
+The configuration mechanism of kamaki is detailed in the
+`setup section <setup.html>`_, it is accessible as *config* and it is common for
+both interaction modes. In specific, the configuration mechanism is implemented
+as  `config`. Using the config commands is as straightforward as in any other
+group of commands.
+
+It is often useful to set, delete or update a value. This can be managed either
+inside the config context or from any command context by using the / prefix.
+
+.. Note:: config updates in kamaki shell persist even after the session is over
+
+All setting changes affect the physical kamaki config file. The config file is
+created automatically at callers' home firectory the first time a config option
+is set, and lives there as *.kamakirc* . It can be edited with any text editor
+or managed with kamaki config commands.
+
+In example 4.4.1 the user is going to work with only one storage container. The
+file commands use the container:path syntax, but if the user sets a container
+name as default, the container name can be omitted.
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 4.4.1: Set default storage container (cloud alias: default)
+
+
+    [file]: list
+      mycontainer (32MB, 2 objects)
+      pithos (0B, 0 objects)
+      trash (2MB, 1 objects)
+
+    [file]: list mycontainer
+      D mydir/
+      20M mydir/rndm_local.file
+    
+    [file]: /config set cloud.default.pithos_container mycontainer
+
+    [file]: list
+      D mydir/
+      20M mydir/rndm_local.file
+
+After a while, the user needs to work with multiple containers, therefore a
+default container is no longer needed. The *pithos_container* setting can be
+deleted, as shown in example 4.4.2
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 4.4.2: Delete a setting option (cloud: default)
+
+
+    [file]: /config delete cloud.default.pithos_container
+
+    [file]: list
+      mycontainer (32MB, 2 objects)
+      pithos (0B, 0 objects)
+      trash (2MB, 1 objects)
+
+History modes
+^^^^^^^^^^^^^
+
+There are two history modes: session and permanent. Session history keeps
+record of all actions in a kamaki shell session, while permanent history
+appends all commands to an accessible history file.
+
+Session history is only available in interactive shell mode. Users can iterate
+through past commands in the same session with the ↑ and ↓ keys. Session
+history is not stored, although commands are recorded through the permanent
+history mechanism.
+
+Permanent history is implemented as a command group and is common to both the
+one-command and shell interfaces. In specific, every command is appended in a
+history file (configured as `history_file` in settings, see
+`setup section <setup.html>`_ for details). Commands executed in one-command
+mode are mixed with the ones run in kamaki shell (also see
+:ref:`using-history-ref` section on this guide).
+
+Scripting
+^^^^^^^^^
+
+The history-run feature allows the sequential run of previous command
+executions in kamaki shell.
+
+The following sequence copies and downloads a file from *mycontainer1* ,
+uploads it to *mycontainer2* , then undo the proccess and repeats it with
+history-run
+
+.. code-block:: console
+    :emphasize-lines: 1,12,19,32
+
+    * Download mycontainer1:myfile and upload it to mycontainer2:myfile *
+    [kamaki]: file
+    [file]: copy mycontainer1:somefile mycontainer1:myfile
+    [file]: download mycontainer1:myfile mylocalfile
+    ...
+    Download completed
+    [file]: upload mylocalfile mycontainer2:myfile -f
+    ...
+    Upload completed
+
+    * undo the process *
+    [file]: !rm mylocalfile
+    [file]: delete mycontainer1:myfile
+    [file]: delete mycontainer2:myfile
+
+    * check history entries *
+    [file]: exit
+    [kamaki]: history
+    [history]: show
+    1.  file
+    2.  file copy mycontainer1:somefile mycontainer1:myfile
+    3.  file download mycontainer1:myfile mylocalfile
+    4.  file upload mylocalfile mycontainer2:myfile -f
+    5.  file delete mycontainer1:myfile
+    6.  file delete mycontainer2:myfile
+    7.  history
+    8.  history show
+
+    *repeat the process *
+    [history]: run 2-4
+    <file copy mycontainer1:somefile mycontainer1:myfile>
+    <file download mycontainer1:myfile mylocalfile>
+    Download completed
+    <file upload mylocalfile mycontainer2:myfile>
+    Upload completed
+
+For powerfull scripting, users are advised to take advantage of their os shell
+scripting capabilities and combine them with kamaki one-command. Still, the
+history-run functionality might prove handy in many occasions.
+
+OS Shell integration
+^^^^^^^^^^^^^^^^^^^^
+
+Kamaki shell features the ability to execute OS-shell commands from any
+context. This can be achieved by typing *!* or *shell*::
+
+    [kamaki_context]: !<OS shell command>
+    ... OS shell command output ...
+
+    [kamaki_context]: shell <OS shell command>
+    ... OS shell command output ...
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 4.7.1: Run unix-style shell commands from kamaki shell
+
+
+    [kamaki]: !ls -al
+    total 16
+    drwxrwxr-x 2 username username 4096 Nov 27 16:47 .
+    drwxrwxr-x 7 username username 4096 Nov 27 16:47 ..
+    -rw-rw-r-- 1 username username 8063 Jun 28 14:48 kamaki-logo.png
+
+    [kamaki]: shell cp kamaki-logo.png logo-copy.png
+
+    [kamaki]: shell ls -al
+    total 24
+    drwxrwxr-x 2 username username 4096 Nov 27 16:47 .
+    drwxrwxr-x 7 username username 4096 Nov 27 16:47 ..
+    -rw-rw-r-- 1 username username 8063 Jun 28 14:48 kamaki-logo.png
+    -rw-rw-r-- 1 username username 8063 Jun 28 14:48 logo-copy.png
+
+
+Kamaki shell commits command strings to the outside shell and prints the
+results, without interacting with it. After a command is finished, kamaki shell
+returns to its initial state, which involves the current directory, as shown in
+example 4.8.2
+
+.. code-block:: console
+    :emphasize-lines: 1
+
+    Example 4.8.2: Attempt (and fail) to change working directory
+
+
+    [kamaki]: !pwd
+    /home/username
+
+    [kamaki]: !cd ..
+
+    [kamaki]: shell pwd
+    /home/username