cms === Cloudmesh used cmd5 which provides an easy to use command line and command shell interface. Hence you can run each command as a separate command line, but you can also start a shell in which you can execute multiple commands one after another. Furthermore, you can create cloudmesh scripts in a file that if run via the cloudmesh shell get executed sequentially. To run the cloudmesh shell you can activate it with the `cms` command. `cms` stands for cloudmesh shell:: cms It will print the banner and enter the shell:: +-------------------------------------------------------+ | ____ _ _ _ | | / ___| | ___ _ _ __| |_ __ ___ ___ ___| |__ | | | | | |/ _ \| | | |/ _` | '_ ` _ \ / _ \/ __| '_ \ |= | | |___| | (_) | |_| | (_| | | | | | | __/\__ \ | | | | | \____|_|\___/ \__,_|\__,_|_| |_| |_|\___||___/_| |_| | +-------------------------------------------------------+ | Cloudmesh CMD5 Shell | +-------------------------------------------------------+ cms> To see the list of commands you can say:: cms> help To see the manual page for a specific command, please use:: help COMMANDNAME Features -------- The following highlighted features are available: - easy command integration through separate modules - multi cloud environments (under development) though cloudmesh-cloud plugin - openapi integration through cloudmesh-openapi plugin - general commands as documented at in the `manual `__ such as `admin `__, `banner `__, `clear `__, `echo `__, `default `__, `info `__, `pause `__, `plugin `__, `quit `__, `shell `__, `sleep `__, `stopwatch `__, `sys `__, `var `__, `version `__, `open `__, and others Execution shell command ~~~~~~~~~~~~~~~~~~~~~~~~ You can execute shell commands when the beginning character is ! :: cms !pwd cms shell pwd Timers ~~~~~~ To switch timers on or off you can use:: cms set timer=on Then every command you type is timed:: cms banner hallo banner ###################################################################### # hallo ###################################################################### Timer: 0.0011s (banner hallo) Variables ~~~~~~~~~ you can store variables with:: cms var a=1 or:: cms set a=1 you can access them on the command line with:: var.a $a Thus if you type:: cms banner var.a or:: cms banner $a it will print the variable value in a banner You can list all variables with:: var list OS Variables can also be integrated. ``os.HOME`` will be replaced with the HOME variable from the shell, try it with:: cms banner os.HOME Defaults ~~~~~~~~ Defaults are variables with a context in which the default applies. For example, we can set default images for a cloud. General defaults are placed in the context ``general``. To set the default cloud you can use:: cms default cloud=kilo To List the defaults use:: cms default list .. todo:: cmd5 default - add the ability to define the defaults also with a . notation. cms default chameleon.image="ubuntu" here the key is image, the context is aws and the value is ubuntu19.04 To use the defaults in a command proceed with the keyword ``default.`` and append the context and the name of the default variable. If the context is missing, the ``general`` context will be used. Examples:: banner default.cloud default image=ubuntu --context=chameleon banner default.chameleon.image Stopwatch ~~~~~~~~~ For some benchmarks, this could be helpful. Naturally in an interactive shell you will not be able to measure reliably as you also measure the response time of the user, but in case you use cloudmesh scripts this could be a great good way for you to customize your benchmarks. We even provide convenient integration for pytests and you can see in our special pytest section on how to use the stopwatch from within pytests. Here is an example of a script:: stopwatch start g stopwatch stop g stopwatch print g Then execute:: cat s.cm | cms You will get something like this:: cat s.cm | cms +-------------------------------------------------------+ | ____ _ _ _ | | / ___| | ___ _ _ __| |_ __ ___ ___ ___| |__ | | | | | |/ _ \| | | |/ _` | '_ ` _ \ / _ \/ __| '_ \ | | | |___| | (_) | |_| | (_| | | | | | | __/\__ \ | | | | | \____|_|\___/ \__,_|\__,_|_| |_| |_|\___||___/_| |_| | +-------------------------------------------------------+ | Cloudmesh CMD5 Shell | +-------------------------------------------------------+ cms> Timer g started ... cms> Timer g started ... cms> Timer g: 0.000274181365967 s Cmd5 has even a convenient benchmark print command that not only prints all timers but includes some information about your machine on which you run the benchmarks. You can get this information with:: cms stopwatch benchmark Accessing Python ~~~~~~~~~~~~~~~~ You can access python in a command line while using the prefix py:: cms py 1 + 1 2 Or redirecting the python output to a cloudmesh variable as part of the set command:: cms set a=\"py 1 + 1\" a='2' Accessing Shell Commands ~~~~~~~~~~~~~~~~~~~~~~~~ You can access shell commands while starting a line with !:: cms \!pwd or you can use it as part of a variable assignment:: cms set a=\!pwd Accessing the yaml file ~~~~~~~~~~~~~~~~~~~~~~~ You can read values from a yaml configuration file in `~/.cloudmesh/cloudmesh.yaml`:: cms set a=cloudmesh.profile.user where it is defined as:: cloudmesh: profile: user: gregor Plugins ------- Cmd5 comes with a sophisticated plugin mechanism. Commands can be readily designed with the help of sys command. The sys command can be installed either from the source (as discussed previously) or via pip .. code:: bash pip install cloudmesh-sys Once you have installed it, execute ``cms help sys`` to see the usage. Now you simply can in a new directory execute the sys command as follows, where ``mycommnad`` is the name of the command you like to implement. .. code:: bash mkdir mycommand cd mycommand cms sys command generate mycommand A directory with the name ``cloudmesh-mycommand`` will be generated that contains the template for the command. You can enter this template and modify the implementation in the folders ``cloudmesh/mycommand/api`` and ``cloudmesh/mycommand/command`` when installing it with .. code:: bash pip install . The command will be added to the cms command> An example for the bar command is presented at: - `cloudmesh/bar/command/bar.py ` It shows how simple the command definition is (bar.py): .. code:: python from __future__ import print_function from cloudmesh.shell.command import command from cloudmesh.shell.command import PluginCommand class BarCommand(PluginCommand): @command def do_bar(self, args, arguments): """ :: Usage: command -f FILE command FILE command list This command does some useful things. Arguments: FILE a file name Options: -f specify the file """ print(arguments) An important difference to other CMD solutions is that our commands can leverage (besides the standard definition), docopts as a way to define the manual page. This allows us to use arguments as dict and use simple if conditions to interpret the command. Using docopts has the advantage that contributors are forced to think about the command and its options and document them from the start. Previously we used not to use docopts and argparse was used. However, we noticed that for some contributions the lead to commands that were either not properly documented or the developers delivered ambiguous commands that resulted in confusion and wrong usage by the users. Hence, we do recommend that you use docopts. The transformation is enabled by the ``@command`` decorator that takes also the manual page and creates a proper help message for the shell automatically. Thus there is no need to introduce a separate help method as would normally be needed in CMD. .. comment: .. |DOI| image:: https://zenodo.org/badge/82920490.svg :target: https://zenodo.org/badge/latestdoi/82920490 .. |Version| image:: https://img.shields.io/pypi/v/cloudmesh-cmd5.svg :target: https://pypi.python.org/pypi/cloudmesh-cmd5 .. |License| image:: https://img.shields.io/badge/License-Apache%202.0-blue.svg :target: https://github.com/cloudmesh/cloudmesh-cmd5/blob/master/LICENSE .. |Python| image:: https://img.shields.io/pypi/pyversions/cloudmesh-cmd5.svg :target: https://pypi.python.org/pypi/cloudmesh-cmd5 .. |Format| image:: https://img.shields.io/pypi/format/cloudmesh-cmd5.svg :target: https://pypi.python.org/pypi/cloudmesh-cmd5 .. |Status| image:: https://img.shields.io/pypi/status/cloudmesh-cmd5.svg :target: https://pypi.python.org/pypi/cloudmesh-cmd5 .. |Travis| image:: https://travis-ci.com/cloudmesh/cloudmesh-cmd5.svg?branch=master :target: https://travis-ci.com/cloudmesh/cloudmesh-cmd5 Docker ------ Developers can easily create a docker container. .. todo:: docker cmd5 - make sure this is working Cloudmesh can be run easily in a container with the help of docker. A Dockerfile is provided as an example that you may adapt for your needs To use the docker file we have included a number or convenient targets also in our makefile. You can create the image with .. code:: bash make image You can run teh image and enter a shell with .. code:: bash make shell This allows you to try things out in the image from bash which is good for development and debugging. You can directly enter the cloudmesh shell ``cms`` with .. code:: bash make cms or say .. warning:: The docker image is not yet updated. .. code:: bash docker run -it cloudmesh/cmd5:1.0 It will create a default .cloudmesh/cloudmesh.yaml file which your would have to modify. The reason we have not mounted the yaml file in the make files form your directory is that we need a clean image to test the initial setup. If you have an example on how to mount the yaml file please let us know and we add it here.