Commit d4f94157 authored by Stavros Sachtouris's avatar Stavros Sachtouris
Browse files

Merge branch 'master' into feature-output

parents 706fc940 6834fc64
CHANGELOG
CHANGELOG for version 0.6.3
1. Clients API relies on objpool instead of snf-common for connection pooling
2. MS Windows compatiblity:
* adjust pithos interface
* adjust pithos client local fs handling
* progress bar configuration not to rely on unicode characters
* adjust hidden Clients API unittests
3. Update documentation:
* rearange text for easier setup
* document undocumented methods in Clients API and cli auxiliary methods
* MS Windows setup guide
4. Improve interface output:
* detailed description mechanism
* uniformity between shell and one-command
* various command-specific improvements
* new print_list, print_dict and print_item methods have:
- better indentation
- enumeration flag
- redundancy of presented information flag
* mechanism for more descriptive syntax errors and arguments help
5. Improve error handling:
* concrete mechanism for client error propagation
* catch some unhandled errors
* mechanism for detailed error descriptions
* context-specific errors
* showcase error handling in store_list
6. CLI Code restructure:
* Introduce ArgumentParseManager class to manage argument parsing
* Introduce a seperate one_command package for handling one_command
* clean-up main CLI code (move interface-specific methods to their pckgs)
7. New history capabilities:
* allow command ranges
* allow backward counting
* in-shell sequensial script-like execution of previous commands
8. Minor new features:
* store_publish returns publication url
* store_list can list with prefixes instead of full path
* hidden optional testing of quoted text and cli.utils.print_* methods
* shell prompt easy to modify
9. Bugfixes:
* Shell does not repeat previous command in case of error
* handle ValueErrors and KeyErrors
* config set values are effective immidiately
* unwanted argument inheritance in shell, removed
1. Introduce a quotaholder client (and primitive cli)
2. Enrich output responses and error reporting with instructions per command
3. Unified result output
4. Stabilize error handling (crashes are much less frequent)
5. Dynamic upper limit on threads when uploading
6. Update documentation
7. Restructure CLI code to clarify what is used in each interface mode
\ No newline at end of file
......@@ -92,17 +92,17 @@ Showcase: Pick an image and list the properties
* list all available images *
[image]:list
1395fdfb-51b4-419f-bb02-f7d632860611 (Ubuntu Desktop LTS)
1580deb4-edb3-4496-a27f-7a246c4c0528 (Ubuntu Desktop)
18a82962-43eb-4b32-8e28-8f8880af89d7 (Kubuntu LTS)
6aa6eafd-dccb-422d-a904-67fe2bdde87e (Debian Desktop)
6b5681e4-7502-46ae-b1e9-9fd837932095 (maelstrom)
78262ee7-949e-4d70-af3a-85360c3de57a (Windows Server 2012)
86bc2414-0fb3-4898-a637-240292243302 (Fedora)
926ab1c5-2d85-49d4-aebe-0fce712789b9 (Windows Server 2008)
b2dffe52-64a4-48c3-8a4c-8214cc3165cf (Debian Base)
baf2321c-57a0-4a69-825d-49f49cea163a (CentOS)
c1d27b46-d875-4f5c-b7f1-f39b5af62905 (Kubuntu)
1395fdfb-51b4-419f-bb02-f7d632860611 Ubuntu Desktop LTS
1580deb4-edb3-4496-a27f-7a246c4c0528 Ubuntu Desktop
18a82962-43eb-4b32-8e28-8f8880af89d7 Kubuntu LTS
6aa6eafd-dccb-422d-a904-67fe2bdde87e Debian Desktop
6b5681e4-7502-46ae-b1e9-9fd837932095 maelstrom
78262ee7-949e-4d70-af3a-85360c3de57a Windows Server 2012
86bc2414-0fb3-4898-a637-240292243302 Fedora
926ab1c5-2d85-49d4-aebe-0fce712789b9 Windows Server 2008
b2dffe52-64a4-48c3-8a4c-8214cc3165cf Debian Base
baf2321c-57a0-4a69-825d-49f49cea163a CentOS
c1d27b46-d875-4f5c-b7f1-f39b5af62905 Kubuntu
* Get properties of image with id b2dffe52-64a4-48c3-8a4c-8214cc3165cf *
[image]:properties b2dffe52-64a4-48c3-8a4c-8214cc3165cf
......@@ -166,17 +166,17 @@ Showcase: Create a server
* List all available images *
[server]:/image list
1395fdfb-51b4-419f-bb02-f7d632860611 (Ubuntu Desktop LTS)
1580deb4-edb3-4496-a27f-7a246c4c0528 (Ubuntu Desktop)
18a82962-43eb-4b32-8e28-8f8880af89d7 (Kubuntu LTS)
6aa6eafd-dccb-422d-a904-67fe2bdde87e (Debian Desktop)
6b5681e4-7502-46ae-b1e9-9fd837932095 (maelstrom)
78262ee7-949e-4d70-af3a-85360c3de57a (Windows Server 2012)
86bc2414-0fb3-4898-a637-240292243302 (Fedora)
926ab1c5-2d85-49d4-aebe-0fce712789b9 (Windows Server 2008)
b2dffe52-64a4-48c3-8a4c-8214cc3165cf (Debian Base)
baf2321c-57a0-4a69-825d-49f49cea163a (CentOS)
c1d27b46-d875-4f5c-b7f1-f39b5af62905 (Kubuntu)
1395fdfb-51b4-419f-bb02-f7d632860611 Ubuntu Desktop LTS
1580deb4-edb3-4496-a27f-7a246c4c0528 Ubuntu Desktop
18a82962-43eb-4b32-8e28-8f8880af89d7 Kubuntu LTS
6aa6eafd-dccb-422d-a904-67fe2bdde87e Debian Desktop
6b5681e4-7502-46ae-b1e9-9fd837932095 maelstrom
78262ee7-949e-4d70-af3a-85360c3de57a Windows Server 2012
86bc2414-0fb3-4898-a637-240292243302 Fedora
926ab1c5-2d85-49d4-aebe-0fce712789b9 Windows Server 2008
b2dffe52-64a4-48c3-8a4c-8214cc3165cf Debian Base
baf2321c-57a0-4a69-825d-49f49cea163a CentOS
c1d27b46-d875-4f5c-b7f1-f39b5af62905 Kubuntu
* See details of flavor with id 1 *
[server]:/flavor info 1
......@@ -207,7 +207,7 @@ Showcase: Create a server
* wait for server to build (optional) *
[server]:wait 11687
Server 11687 still in BUILD mode ||||||||||||||||| | 80% - 3s
Server 11687 still in BUILD mode ||||||||||||||||| | 80%
Server 11687 is now in ACTIVE mode
.. Note:: In kamaki shell, / is used to access top-level command groups while working in command group contexts
......
......@@ -60,7 +60,7 @@ copyright = u'2012, GRNET'
# The short X.Y version.
version = '0.6'
# The full version, including alpha/beta/rc tags.
release = '0.6.2'
release = '0.6.3'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
......
......@@ -7,7 +7,7 @@ Since version 0.6 it is safe to use threaded connections.
The Connection package uses httplib, standard python threads and a connection pooling mechanism.
.. note:: in versions 0.6.0 to 0.6.1 the GRNET Synnefo *snf-common* package is used for its connection pooling module. Since version 0.6.2 the underlying pooling mechanism is packed in a new GRNET package called *objpool*, which is now used instead of snf-common.
.. note:: Since version 0.6.2 the underlying pooling mechanism is packed in a new GRNET package called *objpool*.
.. automodule:: kamaki.clients.connection
:members:
......
......@@ -21,24 +21,23 @@ Add the following to apt sources list
As root, append one of the following to */etc/apt/sources.list*:
* Debian Sid (kamaki 0.6.2)::
deb http://apt.dev.grnet.gr/ sid main
* Debian Stable (kamaki 0.6.1)::
* Debian Stable::
deb http://apt.dev.grnet.gr/ squeeze main
deb http://apt2.dev.grnet.gr stable/
* Ubuntu (kamaki 0.6.1)::
* Ubuntu::
deb http://apt.dev.grnet.gr/ precise main
deb http://ppa.launchpad.net/grnet/synnefo/ubuntu <UBUNTU_VERSION> main
deb-src http://ppa.launchpad.net/grnet/synnefo/ubuntu <UBUNTU_VERSION> main
where <UBUNTU_VERSION> is the system Ubuntu version (e.g. precise)
Update
""""""
.. note:: make sure the GPG public key for the GRNET dev team is added:
* In Debian, make sure the GPG public key for the GRNET dev team is added:
.. code-block:: console
......@@ -46,6 +45,15 @@ Update
otherwise *apt-get update* will produce GPG warnings.
* In Ubuntu, make sure the correct PPA signing key is installed:
.. code-block:: console
$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:grnet/synnefo
Finally:
.. code-block:: console
$ sudo apt-get update
......@@ -54,13 +62,7 @@ Update
Install kamaki
""""""""""""""
.. note:: **versions 0.6.0 - 0.6.1:**
The *snf-common* package (available at synnefo apt repository) will be automatically installed as a dependency.
.. note:: **versions 0.6.2 and on:**
Since version 0.6.2, *objpool* replaces *snf-common*. The objpool package is also available at synnefo repository and is automatically installed as a dependency. The *snf-common* dependency is removed.
.. note:: The objpool package is available at synnefo repositories and is automatically installed as a dependency.
.. code-block:: console
......@@ -106,20 +108,7 @@ A more detailed example of using virtual env can be found at the `snf-image-crea
Install objpool (was: snf-common)
"""""""""""""""""""""""""""""""""
.. note:: **versions 0.6.0 - 0.6.1**
Package snf-common is part of the synnefo project and used to be a kamaki dependency in versions from 0.6.0 to 0.6.1 to provide a connection pooling mechanism. Users who still run 0.6.0 or 0.6.1 may need to manually install the snf-common package:
.. code-block:: console
$ git clone http://code.grnet.gr/git/synnefo
$ cd synnefo/snf-common
$ ./setup build install
$ cd -
**Version 0.6.2 and on:**
Since 0.6.2, kamaki is based on objpool (hence the snf-common dependency is now obsolete). The objpool package is easy to install from source, even on windows platforms:
Since 0.6.2, kamaki is based on python-objpool. The objpool package is easy to install from source (even on windows platforms):
.. code-block:: console
......@@ -131,9 +120,22 @@ Since 0.6.2, kamaki is based on objpool (hence the snf-common dependency is now
Install kamaki
""""""""""""""
Kamaki can be downloaded from `this location <https://code.grnet.gr/projects/kamaki/files>`_, where users can pick the version they prefer and unzip it locally:
.. code-block:: console
$ tar xvfz kamaki-0.6.2.tar.gz
or it can be downloaded directly from the git repository:
.. code-block:: console
$ git clone http://code.grnet.gr/git/kamaki
and then installed by the setup script:
.. code-block:: console
$ cd kamaki
$ ./setup build install
......
......@@ -57,6 +57,21 @@ store
Manage store API.
Hidden command groups
---------------------
quotaholder
A client for quotaholder API. to enable:
kamaki config set quotaholder.cli hotaholder_cli
kamaki config set quotaholder.url <quotaholder server url>
test
Prepared unit-tests for developers (experimental). To enable:
kamaki config set test.cli test_cli
Options
-------
......@@ -85,31 +100,30 @@ history commands
Command user history, as stored in ~/.kamaki.history
* show show user history
* show show intersession history
* clean clean up history
* run run previously executed command(s)
* run run/show previously executed command(s)
server commands
***************
* list list servers
* info get server details
* create create server
* rename update server name
* delete delete server
* reboot reboot server
* start start server
* shutdown shutdown server
* console get a VNC console
* firewall set the firewall profile
* addr list server addresses
* meta get server metadata
* addmeta add server metadata
* setmeta update server metadata
* delmeta delete server metadata
* stats get server statistics
* wait wait for server to finish [BUILD, STOPPED, REBOOT, ACTIVE]
* addr List the addresses of all network interfaces on a server (VM)
* console Get a VNC console to access an existing server (VM)
* create Create a server (aka Virtual Machine)
* delete Delete a server (VM)
* delmeta Delete server (VM) metadata
* firewall Set the server (VM) firewall profile on VMs public network
* info Detailed information on a Virtual Machine
* list List Virtual Machines accessible by user
* meta Get a server's metadatum
* reboot Reboot a server (VM)
* rename Set/update a server (VM) name
* setmeta set server (VM) metadata
* shutdown Shutdown an active server (VM)
* start Start an existing server (VM)
* stats Get server (VM) statistics
* wait Wait for server to finish [BUILD, STOPPED, REBOOT, ACTIVE]
flavor commands
......@@ -122,73 +136,91 @@ flavor commands
image commands and options
**************************
* list list images
* info get image details
* public list public images
* shared list shared images
* delete delete image
* register register an image
* reregister re-register an image (preserve and update properties)
* meta get image metadata
* members get image members
* addmember add a member to an image
* delmember remove a member from an image
* setmembers set the members of an image
* properties get image properties
* setproperty update an image property
* addproperty add an image property
* delproperty delete an image property
* addmember Add a member to an image
* addproperty Add an OS-related property to an image
* delete Delete an image (image file remains intact)
* delmember Remove a member from an image
* delproperty Delete a property of an image
* info Get detailed information on an image
* list List images
* members Get image members
* meta Get image metadata
* properties Get properties related to OS installation in an image
* public List public images
* register (Re)Register an image
* setmembers Set the members of an image
* setproperty Update an existing property in an image
* shared List images shared by a member
network commands
****************
* list list networks
* create create a network
* info get network details
* rename update network name
* delete delete a network
* connect connect a server to a network
* disconnect disconnect a server from a network
* connect Connect a server to a network
* create Create an (unconnected) network
* delete Delete a network
* disconnect Disconnect a nic that connects a server to a network
* info Detailed information on a network
* list List networks
* rename Set the name of a network
store commands
**************
* append Append local file to (existing) remote object
* cat Print a file to console
* copy Copy an object
* create Create a container
* delete Delete a container [or an object]
* delgroup Delete a user group on an account
* delmeta Delete an existing metadatum of account [, container [or object]]
* delpermissions Delete all sharing permissions
* download Download a file
* group Get user groups details for account
* hashmap Get the hashmap of an object
* info Get information for account [, container [or object]]
* list List containers, object trees or objects in a directory
* manifest Create a remote file with uploaded parts by manifestation
* meta Get custom meta-content for account [, container [or object]]
* mkdir Create a directory
* move Copy an object
* overwrite Overwrite part (from start to end) of a remote file
* permissions Get object read/write permissions
* publish Publish an object
* purge Purge a container
* quota Get quota for account [or container]
* setgroup Create/update a new user group on account
* setmeta Set a new metadatum for account [, container [or object]]
* setpermissions Set sharing permissions
* setquota Set new quota (in KB) for account [or container]
* setversioning Set new versioning (auto, none) for account [or container]
* sharers List the accounts that share objects with default account
* touch Create an empty file
* truncate Truncate remote file up to a size
* unpublish Unpublish an object
* upload Upload a file
* versioning Get versioning for account [or container ]
* versions Get the version list of an object
* append Append local file to (existing) remote object
* cat Print remote file contents to console
* copy Copy an object from container to (another) container
* create Create a container
* delete Delete a container [or an object]
* delgroup Delete a user group
* delmeta Delete metadata from account, container or object
* delpermissions Delete all permissions set on object
* download Download remote object as local file
* group Get groups and group members
* hashmap Get the hash-map of an object
* info Get detailed info for account, containers or objects
* list List containers, object trees or objects in a directory
* manifest Create a remote file of uploaded parts by manifestation
* meta Get metadata for account, containers or objects
* mkdir Create a directory
* move Copy an object
* overwrite Overwrite part (from start to end) of a remote file
* permissions Get read and write permissions of an object
* publish Publish the object and print the public url
* purge Delete a container and release related data blocks
* quota Get quota (in KB) for account or container
* setgroup Set a user group
* setmeta Set a piece of metadata for account, container or object
* setpermissions Set permissions for an object
* setquota Set new quota (in KB) for account or container
* setversioning Set versioning mode (auto, none) for account or container
* sharers List the accounts that share objects with current user
* touch Create an empty object (file)
* truncate Truncate remote file up to a size
* unpublish Unpublish an object
* upload Upload a file
* versioning Get versioning for account or container
* versions Get the list of object versions
quotaholder commands (hidden)
*****************************
accept, ack, add, create, get, init, issue, list, query, reject, release, reset, resolve, set
test commands (hidden)
**********************
* all test all clients
* args Test how arguments are treated by kamaki
* astakos test Astakos client
* cyclades test Cyclades client
* error Create an error message with optional message
* image test Image client
* pithos test Pithos client
* prints user-test print methods for lists and dicts
Author
......
......@@ -13,9 +13,11 @@ Once it proved so useful to us, we decided to open the source, so the community
Who uses *kamaki*?
------------------
*kamaki* is currently used internally in GRNET by the development team to test the synnefo software, by the deployment team who operates the ~okeanos service and by the testers using the ~okeanos service and want to access the service from the command line.
Kamaki is targeted to new and advanced users who need an intuitive managerial console tool to manage a local or remote synnefo cloud installation.
What's more, *kamaki* clients API is used in synnefo as an API for accessing remote services as well as for building manager tools of various synnefo functions (e.g. admin image registration).
*kamaki* is currently used (i) internally in GRNET by the development team to test the synnefo software, (ii) by the deployment team which operates the ~okeanos service and (iii) by the testers using the ~okeanos service and want to access the service from the command line.
What's more, (iv) *kamaki* clients API is used in synnefo as an API for accessing remote services as well as (v) for building manager tools of various synnefo functions (e.g. image registration).
Contributing and helping out
......
......@@ -135,6 +135,9 @@ The [global] group is treated by kamaki as a generic group for arbitrary options
* store.account <account name>
if set, it overrides possible global.account option for store level commands.
* store.token <token>
it set, it overrides possible global.token option for store level commands
* compute.url <OOS compute or Cyclades service url>
the url of the OOS compute or Cyclades service. Set to Okeanos.grnet.gr Cyclades IaaS service by default. Users should set a different value if they need to use a different IaaS service.
......@@ -171,3 +174,9 @@ Since version 0.6.1 kamaki contains a test suite for the kamaki.clients API. The
cli=test_cli
After that, users can run "kamaki test" commands to unit-test the prepackaged client APIs. Unit-tests are still experimental and there is a high probability of false alarms due to some of the expected values being hard-coded in the testing code.
Since version 0.6.3, a quotaholder client is introduced as an advanced feature. Quotaholder client is mostly used as a client library for accessing a synnefo quota service, but it can also be allowed as a kamaki command set, but setting the quotaholder.cli and quotaholder.url methods:
[quotaholder]
cli=quotaholder_cli
url=<URL of quotaholder service>
......@@ -270,7 +270,7 @@ The astakos-authenticate command in example 3.4.1 run against an explicitly prov
Interactive shell
-----------------
Kamaki interactive shell is details in this section
Kamaki interactive shell is detailed in this section
Command Contexts
^^^^^^^^^^^^^^^^
......@@ -477,11 +477,10 @@ It is often the case that a user who works in the context command, needs to crea
[server]:/flavor list
...
20. AFLAVOR
43 AFLAVOR
SNF:disk_template: drbd
cpu : 4
disk : 10
id : 43
ram : 2048
[server]:/image list
......@@ -493,7 +492,7 @@ It is often the case that a user who works in the context command, needs to crea
[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 acquires a new token (with a browser) which has to be set to kamaki.
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 (with a browser) which has to be set to kamaki.
.. code-block:: console
:emphasize-lines: 1
......@@ -519,6 +518,8 @@ An other example (4.3.2) showcases how to acquire and modify configuration setti
1. pithos (10MB, 2 objects)
2. trash (0B, 0 objects)
.. note:: actual kamaki error messages are more helpful and descriptive.
The following example compares some equivalent calls that run *astakos-authenticate* after a *store-list* 401 failure.
.. code-block:: console
......@@ -617,9 +618,9 @@ Permanent history is implemented as a command group and is common to both the on
Scripting
^^^^^^^^^
Since version 6.2, the history-load feature allows the sequential execution of previously run kamaki commands in kamaki shell.
Since version 6.2, the history-run feature allows the sequential execution of previously run kamaki commands in kamaki shell.
The following kamaki sequence copies and downloads a file from mycontainer1, uploads it to mycontainer2, then undo the proccess and repeats it with history-load
The following kamaki 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
......@@ -663,7 +664,7 @@ The following kamaki sequence copies and downloads a file from mycontainer1, upl
store upload mylocalfile mycontainer2:myfile
Upload completed
The above strategy is still very primitive. Users are advised to take advantage of their os shell scripting capabilities and combine them with kamaki one-command for powerful scripting. Still, the history-load functionality might prove handy for kamaki shell users.
The above strategy is still very primitive. Users are advised to take advantage of their os shell scripting capabilities and combine them with kamaki one-command for powerful scripting. Still, the history-run functionality might prove handy for kamaki shell users.
Tab completion
^^^^^^^^^^^^^^
......
......@@ -31,4 +31,4 @@
# interpreted as representing official policies, either expressed
# or implied, of GRNET S.A.
__version__ = '0.6.2'
__version__ = '0.6.3'
......@@ -415,8 +415,7 @@ class store_list(_store_container_command):
@command(pithos_cmds)
class store_mkdir(_store_container_command):
"""Create a directory
"""
"""Create a directory"""
__doc__ += '\n. '.join(about_directories)
......@@ -942,7 +941,12 @@ class store_upload(_store_container_command):
err,
'No container %s in account %s'\
% (self.container, self.account),
details=self.generic_err_details)
details=[self.generic_err_details])
elif err.status == 800:
raiseCLIError(err, details=[
'Possible cause: temporary server failure',
'Try to re-upload the file',
'For more error details, try kamaki store upload -d'])
raise_connection_errors(err)
raiseCLIError(err, '"%s" not accessible' % container____path__)
except IOError as err:
......
# Copyright 2012 GRNET S.A. All rights reserved.
#
# Redistribution and use in source and binary forms, with or
# without modification, are permitted provided that the following
# conditions are met:
#
# 1. Redistributions of source code must retain the above
# copyright notice, this list of conditions and the following
# disclaimer.
#
# 2. Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials
# provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# The views and conclusions contained in the software and
# documentation are those of the authors and should not be
# interpreted as representing official policies, either expressed
# or implied, of GRNET S.A.
from kamaki.cli.commissioning import commissioning_cli
from kamaki.clients.quotaholder import QuotaholderClient
class quotaholder_cli(commissioning_cli):
def __init__(self):
self.client = QuotaholderClient
self.add_context = True
self.description = 'Quotaholder description'
super(self.__class__, self).__init__()
cli = quotaholder_cli()
cli.generate_all()
_commands = [cli.ctree]
# Copyright 2012 GRNET S.A. All rights reserved.
#
# Redistribution and use in source and binary forms, with or
# without modification, are permitted provided that the following
# conditions are met: