from xen.xend import sxp
from xen.xend.XendError import XendError
from xen.xend.XendLogging import log
-from xen.xend.xenstore import XenNode, DBMap
+from xen.xend.xenstore import XenNode, DBMap, DBVar
def vnet_cmd(cmd):
out = None
class XendVnetInfo:
vifctl_ops = {'up': 'vif.add', 'down': 'vif.del'}
+
+ __exports__ = [
+ DBVar('id', ty='str'),
+ DBVar('dbid', ty='str'),
+ DBVar('config', ty='sxpr'),
+ ]
- def __init__(self, config):
- self.config = config
- self.id = sxp.child_value(config, 'id')
- self.id = str(self.id)
+ def __init__(self, db, config=None):
+ if config:
+ self.id = sxp.child_value(config, 'id')
+ self.id = str(self.id)
+ self.dbid = self.id.replace(':', '-')
+ self.db = db.addChild(self.dbid)
+ self.config = config
+ else:
+ self.db = db
+ self.importFromDB()
+ config = self.config
+
self.bridge = sxp.child_value(config, 'bridge')
if not self.bridge:
self.bridge = "vnet%s" % self.id
self.vnetif = sxp.child_value(config, 'vnetif')
if not self.vnetif:
- self.vnetif = "vnetif%s" % self.id
+ self.vnetif = "vnif%s" % self.id
+
+ def saveToDB(self, save=False, sync=False):
+ self.db.saveDB(save=save, sync=sync)
+
+ def exportToDB(self, save=False, sync=False):
+ self.db.exportToDB(self, fields=self.__exports__, save=save, sync=sync)
+
+ def importFromDB(self):
+ self.db.importFromDB(self, fields=self.__exports__)
def sxpr(self):
return self.config
log.info("Deleting vnet %s", self.id)
Brctl.vif_bridge_rem({'bridge': self.bridge, 'vif': self.vnetif})
Brctl.bridge_del(self.bridge)
- return vnet_cmd(['vnet.del', self.id])
+ val = vnet_cmd(['vnet.del', self.id])
+ self.db.delete()
+ return val
def vifctl(self, op, vif, vmac):
try:
def __init__(self):
# Table of vnet info indexed by vnet id.
self.vnet = {}
- self.dbmap = DBMap(db=XenNode(self.dbpath))
- self.dbmap.readDB()
- for vnetdb in self.dbmap.values():
- config = vnetdb.config
- info = XendVnetInfo(config)
- self.vnet[info.id] = info
+ self.db = DBMap(db=XenNode(self.dbpath))
+ self.db.readDB()
+ for vnetdb in self.db.values():
try:
+ info = XendVnetInfo(vnetdb)
+ self.vnet[info.id] = info
info.configure()
except XendError, ex:
log.warning("Failed to configure vnet %s: %s", str(info.id), str(ex))
+ except Exception, ex:
+ log.exception("Vnet error")
+ vnetdb.delete()
def vnet_of_bridge(self, bridge):
"""Get the vnet for a bridge (if any).
@param config: config
"""
- info = XendVnetInfo(config)
+ info = XendVnetInfo(self.db, config=config)
self.vnet[info.id] = info
- self.dbmap["%s/config" % info.id] = info.sxpr()
+ info.saveToDB()
info.configure()
def vnet_delete(self, id):
info = self.vnet_get(id)
if info:
del self.vnet[id]
- self.dbmap.delete(id)
info.delete()
def instance():
Limit the transmission rate of a virtual network interface
network-list <DomId> List virtual network interfaces for a domain
+ Vnet commands:
+ vnet-list [-l|--long] list vnets
+ vnet-create <config> create a vnet from a config file
+ vnet-delete <vnetid> delete a vnet
+
For a short list of subcommands run 'xm help'
For more help on xm see the xm(1) man page
For more help on xm create, see the xmdomain.cfg(5) man page"""
from xen.xend.XendClient import server
server.xend_domain_device_destroy(dom, 'vbd', dev)
+def xm_vnet_list(args):
+ from xen.xend.XendClient import server
+ try:
+ (options, params) = getopt(args, 'l', ['long'])
+ except GetoptError, opterr:
+ err(opterr)
+ sys.exit(1)
+
+ use_long = 0
+ for (k, v) in options:
+ if k in ['-l', '--long']:
+ use_long = 1
+
+ if params:
+ use_long = 1
+ vnets = params
+ else:
+ vnets = server.xend_vnets()
+
+ for vnet in vnets:
+ try:
+ if use_long:
+ info = server.xend_vnet(vnet)
+ PrettyPrint.prettyprint(info)
+ else:
+ print vnet
+ except Exception, ex:
+ print vnet, ex
+
+def xm_vnet_create(args):
+ arg_check(args, 1, "vnet-create")
+ conf = args[0]
+ from xen.xend.XendClient import server
+ server.xend_vnet_create(conf)
+
+def xm_vnet_delete(args):
+ arg_check(args, 1, "vnet-delete")
+ vnet = args[0]
+ from xen.xend.XendClient import server
+ server.xend_vnet_delete(vnet)
+
commands = {
# console commands
"console": xm_console,
"block-refresh": xm_block_refresh,
# network
"network-limit": xm_network_limit,
- "network-list": xm_network_list
+ "network-list": xm_network_list,
+ # vnet
+ "vnet-list": xm_vnet_list,
+ "vnet-create": xm_vnet_create,
+ "vnet-delete": xm_vnet_delete,
}
aliases = {