CM4 Details (outdated)¶
In cloudmesh, we are using the Python tool to implement a program that could remotely control cloud nodes provided by different organizations and run experiments in parallel.
The goal of cloudmesh
is to provide a platform that users could
directly control the nodes they have, like AWS, Azure, and OPENSTACK
instances. Users could decide to start, stop, destroy, create, resume,
and suspend different nodes without accessing the Console interfaces
of providers. Then users could install experiment environment, software,
and other required tools in these running nodes. Finally, an experiment
could be executed in running nodes by sending the commands from
cloudmesh
platform. Meanwhile, we embed the NoSQL database
cloudmesh
platform. Meanwhile, we embed the NoSQL database
MongoDB into cloudmesh for managing the nodes and experiments.
Getting the config object¶
from cloudmesh.cloud.configuration.config import Config
config = Config().data["cloudmesh"]
Getting values¶
To get values from the configurations, you can call level by level from top-down config.
MONGO_HOST = config["data.mongo.MONGO_HOST"]
Using the Counter file¶
CM4 keeps track of all the VMs running using counters for each VM. The counter file is located at
~/.cloudmesh/counter.yaml
Using the counter¶
from cloudmesh.cloud.configuration.counter import Counter
counter = Counter()
Data Scheme in MongoDB¶
There are three types of documents in MongoDB:
Node information in
cloud
collection. Different cloud service providers would return different schemas of node information. It is hard to manipulate different nodes’ information into same schema, so we decide to dump the return mesaage into MongoDB without any changes.Node’s experiment status in
status
collection. The document instatus
collection is going to save the information of experiments executed in a node.{'_id': node_id, 'status': status, 'currentJob': job_id, 'history' : the history of executed experiments in this node}
Experiment information in
job
collection.{'_id': experiment_id 'name': name, 'status': status, 'input': input_info, 'output': output_info, 'description': description, 'commands': commands}
Group information in
group
collection.{'cloud': cloud, 'name': name, 'size': size, 'vms': list_vms}
The Virtual Machine Provider¶
In cloudmesh
, we developed the cloudmesh-cloud/vm/Vm.py
class to
implement the operations for different virtual machines from AWS, Azure,
and Chameleon by using the python library Apache
Libcloud to interact with cloud service
providers.
The basic functions are:
- start(vm_name)
start the virtual machine with specified name
- stop(vm_name, deallocate)
stop the virtual machine with specified name
- resume(vm_name)
resume the suspended virtual machine with specified name
- suspend(vm_name)
suspend the running virtual machine with specified name
- destroy(vm_name)
destroy the virtual machine with specified name
- list()
list all virtual machine in your cloud service account
- status(vm_name)
show the working status of virtual machine with specified name
- info(vm_name)
show all information about the virtual machine with specified name
- get_public_ips(vm_name)
return the public ip of the virtual machine with specified name
- set_public_ip(vm_name, public_ip)
set the public ip for the virtual machine with specified name
- remove_public_ip(vm_name)
remove the public ip from virtual machine with specified name
Next we list some sample of running these functions for virtual machines in AWS, Azure and Openstack.
AWS VM Operations (Yu)¶
Before using the AWS Vm code, user has to update their AWS information
into cloudmesh.yaml
file in etc folder.
The Libcloud library has enough methods to support the operations for
managing virtual machines in AWS. We use a cloudmesh-cloud/vm/Aws.py
to create the driver based on the configuration to connect to AWS.
Inherit the Libcloud library, we did some modifications on
AWSDriver
to extend the operation. The create_node
method would
create a virtual machine in AWS based on the configuration of
cloudmesh.yaml
file
Here are some samples for running these operations by using
cloudmesh-cloud
:
First, user would create the virtual machine in AWS.
$ cms vm create
Collection(Database(MongoClient(host=['127.0.0.1:27017'],
document_class=dict, tz_aware=False, connect=True),
'cloudmesh'), 'cloud')
Thread: updating the status of node
Created base-cloudmesh-yuluo-4
PING 52.39.13.229 (52.39.13.229): 56 data bytes
--- 52.39.13.229 ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
VM Refactoring¶
In addition, in order to offer more flexibilities to our users, we also
developed vmrefactor (cloudmesh-cloud/vm/VmRefactor.py
) to allow
users to customize the flavors of their running instances and services
in different providers.
- resize(vm_name, size)
resize the virtual machine with specified size object
- confirm_resize(vm_name)
some providers requires confirmation message to complete resize() operation
- revert(vm_name)
revert a resize operation. Revert the virtual machine to previous status
- rename(vm_name, newname)
rename the virtual machine
- rebuild(vm_name, image)
rebuild the virtual machine to another image/OS with image object.
Currently, major providers usually charge users according to their usage. It might be finacially wise sometimes to shift between different service size to reduce unnecessary cost. VmRefactor is designed based on this idea to help users to achieve higher cost efficiency. VmRefactor can also help users navigate thier management tasks especially when they have many different tasks on the run=.