You are viewing a plain text version of this content. The canonical link for it is here.
Posted to tashi-commits@incubator.apache.org by mr...@apache.org on 2009/02/06 21:56:06 UTC
svn commit: r741750 - /incubator/tashi/trunk/src/tashi/client/tashi-client.py
Author: mryan3
Date: Fri Feb 6 21:56:05 2009
New Revision: 741750
URL: http://svn.apache.org/viewvc?rev=741750&view=rev
Log:
Updates to the client program including automatic MAC address generation and createMany, destroyMany, and getMyInstances functions.
Also, examples are not printed by default.
Modified:
incubator/tashi/trunk/src/tashi/client/tashi-client.py
Modified: incubator/tashi/trunk/src/tashi/client/tashi-client.py
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/src/tashi/client/tashi-client.py?rev=741750&r1=741749&r2=741750&view=diff
==============================================================================
--- incubator/tashi/trunk/src/tashi/client/tashi-client.py (original)
+++ incubator/tashi/trunk/src/tashi/client/tashi-client.py Fri Feb 6 21:56:05 2009
@@ -18,6 +18,7 @@
# under the License.
import os
+import random
import sys
import types
from tashi.services.ttypes import *
@@ -72,6 +73,12 @@
def requiredArg(name):
raise ValueError("Missing required argument %s" % (name))
+def randomMac():
+ return ("52:54:00:%2.2x:%2.2x:%2.2x" % (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
+
+def randomNetwork():
+ return [NetworkConfiguration(d={'mac':randomMac(), 'network':1})]
+
def parseDisks(arg):
try:
strDisks = arg.split(",")
@@ -130,19 +137,55 @@
hosts[i.hostId].usedCores += machineTypes[i.type].cores
return hosts.values()
+def createMany(instance, count):
+ l = len(str(count))
+ basename = instance.name
+ instances = []
+ for i in range(0, count):
+ for nic in instance.nics:
+ nic.mac = randomMac()
+ instance.name = basename + (("-%" + str(l) + "." + str(l) + "d") % (i))
+ instances.append(client.createVm(instance))
+ return instances
+
+def destroyMany(basename):
+ instances = client.getInstances()
+ count = 0
+ for i in instances:
+ if (i.name.startswith(basename + "-") and i.name[len(basename)+1].isdigit()):
+ client.destroyVm(i.id)
+ count = count + 1
+ if (count == 0):
+ raise ValueError("That is an unused basename")
+ return None
+
+def getMyInstances():
+ userId = getUser()
+ _instances = client.getInstances()
+ instances = []
+ for i in _instances:
+ if (i.userId == userId):
+ instances.append(i)
+ return instances
+
# Used to define default views on functions and to provide extra functionality (getVmLayout)
extraViews = {
+'createMany': (createMany, ['id', 'hostId', 'name', 'user', 'state', 'disk', 'memory', 'cores']),
+'destroyMany': (destroyMany, None),
'getVmLayout': (getVmLayout, ['id', 'name', 'state', 'instances', 'usedMemory', 'memory', 'usedCores', 'cores']),
-'getInstances': (None, ['id','hostId','name','user','state','disk','memory','cores'])
+'getInstances': (None, ['id', 'hostId', 'name', 'user', 'state', 'disk', 'memory', 'cores']),
+'getMyInstances': (getMyInstances, ['id', 'hostId', 'name', 'user', 'state', 'disk', 'memory', 'cores'])
}
# Used to specify what args are excepted for a function, what to use to convert the string to a value, what to use as a default value if it's missing, and whether the argument was required or not
argLists = {
-'createVm': [('userId', int, getUser, False), ('name', str, lambda: requiredArg('name'), True), ('type', int, lambda: 1, False), ('disks', parseDisks, lambda: requiredArg('disks'), True), ('nics', parseNics, lambda: [NetworkConfiguration(d={'mac':"",'network':1})], False), ('hints', parseHints, lambda: {}, False)],
+'createVm': [('userId', int, getUser, False), ('name', str, lambda: requiredArg('name'), True), ('type', int, lambda: 1, False), ('disks', parseDisks, lambda: requiredArg('disks'), True), ('nics', parseNics, randomNetwork, False), ('hints', parseHints, lambda: {}, False)],
+'createMany': [('userId', int, getUser, False), ('basename', str, lambda: requiredArg('basename'), True), ('type', int, lambda: 1, False), ('disks', parseDisks, lambda: requiredArg('disks'), True), ('nics', parseNics, randomNetwork, False), ('hints', parseHints, lambda: {}, False), ('count', int, lambda: requiredArg('count'), True)],
'shutdownVm': [('instance', checkIid, lambda: requiredArg('instance'), True)],
'destroyVm': [('instance', checkIid, lambda: requiredArg('instance'), True)],
+'destroyMany': [('basename', str, lambda: requiredArg('basename'), True)],
'suspendVm': [('instance', checkIid, lambda: requiredArg('instance'), True), ('destination', str, lambda: requiredArg('destination'), True)],
-'resumeVm': [('userId', int, getUser, False), ('name', str, lambda: requiredArg('name'), True), ('type', int, lambda: 1, False), ('disks', parseDisks, lambda: requiredArg('disks'), True), ('nics', parseNics, lambda: [NetworkConfiguration(d={'mac':"",'network':1})], False), ('hints', parseHints, lambda: {}, False), ('source', str, lambda: requiredArg('source'), True)],
+'resumeVm': [('userId', int, getUser, False), ('name', str, lambda: requiredArg('name'), True), ('type', int, lambda: 1, False), ('disks', parseDisks, lambda: requiredArg('disks'), True), ('nics', parseNics, randomNetwork, False), ('hints', parseHints, lambda: {}, False), ('source', str, lambda: requiredArg('source'), True)],
'migrateVm': [('instance', checkIid, lambda: requiredArg('instance'), True), ('targetHostId', int, lambda: requiredArg('targetHostId'), True)],
'pauseVm': [('instance', checkIid, lambda: requiredArg('instance'), True)],
'unpauseVm': [('instance', checkIid, lambda: requiredArg('instance'), True)],
@@ -150,14 +193,17 @@
'getHosts': [],
'getUsers': [],
'getInstances': [],
+'getMyInstances': [],
'getVmLayout': [],
}
# Used to convert the dictionary built from the arguments into an object that can be used by thrift
convertArgs = {
'createVm': '[Instance(d={"userId":userId,"name":name,"type":type,"disks":disks,"nics":nics,"hints":hints})]',
+'createMany': '[Instance(d={"userId":userId,"name":basename,"type":type,"disks":disks,"nics":nics,"hints":hints}), count]',
'shutdownVm': '[instance]',
'destroyVm': '[instance]',
+'destroyMany': '[basename]',
'suspendVm': '[instance, destination]',
'resumeVm': '[Instance(d={"userId":userId,"name":name,"type":type,"disks":disks,"nics":nics,"hints":hints}), source]',
'migrateVm': '[instance, targetHostId]',
@@ -168,8 +214,10 @@
# Example use strings
examples = {
'createVm': ['--name foobar --disks i386-hardy.qcow2', '--userId 3 --name foobar --type 9 --disks mpi-hardy.qcow2:True,scratch.qcow2:False --nics 2:52:54:00:00:12:34,1:52:54:00:00:56:78 --hints enableDisplay=True'],
+'createMany': ['--basename foobar --disks i386-hardy.qcow2 --count 4'],
'shutdownVm': ['--instance 12345', '--instance foobar'],
'destroyVm': ['--instance 12345', '--instance foobar'],
+'destroyMany': ['--basename foobar'],
'suspendVm': ['--instance 12345 --destination imgfile', '--instance foobar --destination imgfile'],
'resumeVm': ['--name foobar --disks i386-hardy.qcow2 --nics 2:52:54:00:7a:8c:9d --source foobar'],
'migrateVm': ['--instanc 12345 --targetHostId 73', '--instance foobar --targetHostId 73'],
@@ -179,6 +227,7 @@
'getHosts': [''],
'getUsers': [''],
'getInstances': [''],
+'getMyInstances': [''],
'getVmLayout': [''],
}
@@ -200,11 +249,13 @@
else:
line += " [--%s <value>]" % (arg[0])
print line
- print
- for example in examples[f]:
- print "\t\t" + f + " " + example
- print
+ if ("--examples" in sys.argv):
+ print
+ for example in examples.get(f, []):
+ print "\t\t" + f + " " + example
+ print
print "Additionally, all functions accept --show-<name> and --hide-<name>, which show and hide columns during table generation"
+ print "Use \"--examples\" to see examples of all the functions"
sys.exit(-1)
def transformState(obj):
@@ -350,7 +401,7 @@
args = sys.argv[2:]
vals = {}
for arg in args:
- if (arg == "--help"):
+ if (arg == "--help" or arg == "--examples"):
usage(function)
for parg in possibleArgs:
(parg, conv, default, required) = parg