Ejemplo n.º 1
0
 def purgeDomain(self, req):
     conn = util.getConnection()
     domain = self.getDomain(req, conn)
     ret = dict()
     ret['code'] = self.__class__.DOMAIN_ERROR_CODE_OK
     if domain == None:
         ret['code'] = self.__class__.DOMAIN_ERROR_CODE_NOT_FOUND
     else:
         doc = libxml2.parseDoc(domain.XMLDesc(0))
         xml_disks = doc.xpathEval('//disk')
         if domain.state(0)[0] == libvirt.VIR_DOMAIN_RUNNING:
             domain.destroy()
         domain.undefine()
         for xml_disk in xml_disks:
             if not xml_disk.hasProp('device'):
                 continue
             if xml_disk.prop('device') == 'cdrom':
                 continue
             sub_ele = xml_disk.firstElementChild()
             path = None
             while sub_ele:
                 if sub_ele.name == 'source':
                     path = sub_ele.prop('file') if xml_disk.prop(
                         'type') == 'file' else sub_ele.prop('dev')
                     break
                 sub_ele = sub_ele.nextElementSibling()
             if path != None:
                 try:
                     vol = conn.storageVolLookupByPath(path)
                     vol.delete(0)
                 except:
                     pass
     req.write(json.dumps(ret))
     req.finish()
def loadData():
  con = util.getConnection()
  cf = ColumnFamily(con, 'videos_denorm')
  tagCF = ColumnFamily(con, 'tag_videos_composite')
  movies = util.readCSV('data/movies')
  for movie in movies:
    title = movie[0]
    uploader = movie[1]
    runtime = int(movie[2]) #convert to match column validator
    tags = movie[3]
    rowKey = title+":"+uploader


    print "Inserting in videos: {}.".format(str(movie))
    row = \
      {
        'title':title,
        'user_name':uploader,
        'runtime_in_sec':runtime,
      }

    for tag in tags.split(','):
      print 'adding tag: {0} for movie: {1}'.format(tag, title)
      row['tag:{}'.format(tag.strip().lower())] = tag.strip()

    print 'inserting denorm: {}'.format(row)
    cf.insert(rowKey, row)

  print 'finishished insertion.'    
  con.dispose()
Ejemplo n.º 3
0
    def listDomains(self, req):
        conn = util.getConnection('R')
        try:
            domainNames = conn.listDefinedDomains()
            domains = list()
            for name in domainNames:
                domain = conn.lookupByName(name)
                domains.append(domain)
            domainIDs = conn.listDomainsID()
            for id in domainIDs:
                domain = conn.lookupByID(id)
                domains.append(domain)

            domainList = list()
            for domain in domains:
                d = dict()
                d["id"] = domain.ID()
                d["name"] = domain.name()
                d["uuid"] = domain.UUIDString()
                d["state"] = domain.state(0)
                domainList.append(d)
        finally:
            conn.close()
        req.write(json.dumps(domainList))
        req.finish()
def loadData():
  con = util.getConnection()
  cf = ColumnFamily(con, 'videos')
  tagCF = ColumnFamily(con, 'tag_videos_sup')
  movies = util.readCSV('data/movies')
  for movie in movies:
    title = movie[0]
    uploader = movie[1]
    runtime = int(movie[2]) #convert to match column validator
    tags = movie[3]
    rowKey = title+":"+uploader


    print "Inserting in videos: {}.".format(str(movie))
    cf.insert(
      rowKey, 
      {
        'title':title,
        'user_name':uploader,
        'runtime_in_sec':runtime,
        'tags_csv': tags
      })
    for tag in tags.split(','):
      print 'adding tag: {0} for movie: {1}'.format(tag, title)
      tagCF.insert(
          tag.strip().lower(),   # row-key = tag name
          {
            uploader: {          # level 1 nesting = uploader name
              rowKey: title      # level 2 nesting = videoId, value = title
             }
          }
      );

  print 'finishished insertion.'    
  con.dispose()
def get():
#################### TEMP
  #userId = 'user-784b9158-5233-454e-8dcf-c229cdff12c6'
  print 'Getting result for userId: {0} between time {1} and {2}'.format(userId, startTime, startTime)
  con = util.getConnection()
  logCF = ColumnFamily(con, 'event_log_mux')
  
  rowKeys = ['{0}:{1}'.format(userId, i+1) for i in range(4)]
  rows = logCF.multiget(rowKeys)
  
  print 'Shows rows multiplexes into different rows each individually sorted in reverse cronological order:'
  merge = {}
  for row in rows:
    print '>> '+str(row) 
    merge = dict(merge.items() + rows[row].items())
    for col in rows[row]:
      colstr = rows[row][col]
      coljson = json.loads(colstr)
      print '\tInsertion Timestamp: {0}'.format(coljson['insert_time'])
  
  final = collections.OrderedDict(sorted(merge.items(), reverse=True))
  for k,v in final.iteritems():
    coljson = json.loads(v)
    print 'insertion timestamp: {0}'.format(coljson['insert_time'])

  """
def loadData():
  con = util.getConnection()
  cf = ColumnFamily(con, 'videos')
  tagCF = ColumnFamily(con, 'tag_videos_composite')
  movies = util.readCSV('data/movies')
  for movie in movies:
    title = movie[0]
    uploader = movie[1]
    runtime = int(movie[2]) #convert to match column validator
    tags = movie[3]
    rowKey = title+":"+uploader


    print "Inserting in videos: {}.".format(str(movie))
    row = \
      {
        'title':title,
        'user_name':uploader,
        'runtime_in_sec':runtime,
        'tags_csv': tags
      }

    cf.insert(rowKey, row)

    print 'inserting tags: {}'.format(tags)
    for tag in tags.split(','): 
      tagCF.insert( 
          tag.strip().lower(),        #row-key = tag name 
          { 
            (uploader, rowKey): title #(uploader,videoId)=title 
          } 
      );

  print 'finishished insertion.'    
  con.dispose()
Ejemplo n.º 7
0
 def newVol(self, req):
     conn = util.getConnection()
     ret = dict()
     try:
         if not req.args.has_key('source'):
             raise BaseException()
         pool = conn.storagePoolLookupByName(req.args['source'][0])
         doc = libxml2.parseDoc(pool.XMLDesc(0))
         root = doc.getRootElement()
         pool_type = root.prop('type')
         poolInfo = pool.info()
         disk_size = int(req.args['size'][0])
         if disk_size * 1024 * 1024 * 1024 > poolInfo[3]:
             raise BaseException()
         disk_prefix = None
         if req.args.has_key('prefix'):
             disk_prefix = req.args['prefix'][0]
         else:
             disk_prefix = str(uuid.uuid4())
         disk_idx = 1
         disk_name = disk_prefix + '-' + str(disk_idx)
         while True:
             try:
                 pool.storageVolLookupByName(disk_name)
                 disk_idx = disk_idx + 1
                 disk_name = disk_prefix + '-' + str(disk_idx)
                 continue
             except:
                 break
         volDoc = libxml2.parseDoc('<volume/>')
         volRoot = volDoc.getRootElement()
         node = libxml2.newNode('name')
         node.setContent(disk_name)
         volRoot.addChild(node)
         node = libxml2.newNode('capacity')
         node.newProp('unit', 'G')
         node.setContent(str(disk_size))
         volRoot.addChild(node)
         if pool_type == 'dir':
             node = libxml2.newNode('allocation')
             node.newProp('unit', 'G')
             node.setContent('0')
             volRoot.addChild(node)
         vol = pool.createXML(volRoot.serialize(), 0)
         ret['prefix'] = disk_prefix
         ret['path'] = vol.path()
         ret['size'] = vol.info()[1]
     except:
         pass
     finally:
         conn.close()
     return ret
Ejemplo n.º 8
0
 def queryDomain(self, req):
     conn = util.getConnection()
     domain = self.getDomain(req, conn)
     domainList = list()
     if domain != None:
         d = dict()
         d["id"] = domain.ID()
         d["name"] = domain.name()
         d["uuid"] = domain.UUIDString()
         d["state"] = domain.state(0)
         domainList.append(d)
     conn.close()
     req.write(json.dumps(domainList))
     req.finish()
Ejemplo n.º 9
0
 def getPort(self, uuid):
     conn = util.getConnection()
     try:
         domain = conn.lookupByUUIDString(uuid)
         doc = libxml2.parseDoc(domain.XMLDesc(0))
         graphics = doc.xpathEval('//graphics')
         if len(graphics) == 0:
             return None
         for graphic in graphics:
             if graphic.prop('type') == 'vnc':
                 return int(graphic.prop('port'))
     finally:
         conn.close()
     return None
def getByTag(tag):
  con = util.getConnection()
  vidCF = ColumnFamily(con, 'videos')
  tagCF = ColumnFamily(con, 'tag_videos')

  movies = tagCF.get(tag.strip().lower())
  for key, val in movies.iteritems():
    vidId = key.split('_')[1]
    movieDetail = vidCF.get(vidId)
    print '''
    {{
      user: {0},
      movie: {1},
      tags: {2}
    }}'''.format(movieDetail['user_name'], movieDetail['title'], movieDetail['tags_csv'])

  con.dispose()
Ejemplo n.º 11
0
 def newMemory(self, req):
     conn = util.getConnection()
     domain = self.getDomain(req, conn)
     ret = dict()
     ret['code'] = self.__class__.DOMAIN_ERROR_CODE_OK
     if domain == None:
         ret['code'] = self.__class__.DOMAIN_ERROR_CODE_NOT_FOUND
     elif not req.args.has_key('value'):
         ret['code'] = self.__class__.DOMAIN_ERROR_CODE_BAD_PARAMETER
     elif domain.state(0)[0] == libvirt.VIR_DOMAIN_RUNNING:
         domain.setMemory(int(req.args['value'][0]))
         ret['value'] = int(req.args['value'][0])
     else:
         ret['value'] = domain.info()[2]
     conn.close()
     req.write(json.dumps(ret))
     req.finish()
Ejemplo n.º 12
0
 def createDomain(self, req):
     obj = json.load(req.content)
     xmlDef = self.parseDefinition(obj, req)
     if xmlDef != None:
         try:
             conn = util.getConnection()
             dom = conn.defineXML(xmlDef)
             #                dom.create()
             res = dict()
             res['code'] = self.__class__.DOMAIN_ERROR_CODE_OK
             res['name'] = dom.name()
             res['uuid'] = dom.UUIDString()
             res['state'] = dom.state(0)
             req.write(json.dumps(res))
             req.finish()
             return
         finally:
             conn.close()
def randomEvent(i, events):
  event = random.choice(events)
  con = util.getConnection()
  eventsCF = ColumnFamily(con, 'event_log')

  for j in range(50):
    event = random.choice(events)
    rowkey = event['user']
    timestamp = datetime.datetime.utcnow()
    colval = json.dumps(event)

    print '[Thread:{3}] Inserting: [{0}=> {{{1}:{2}}}]'.format(rowkey, timestamp, colval, i)
    eventsCF.insert(rowkey, {timestamp: colval})

    time.sleep(0.1) #100 milliseconds

  print 'finishished insertion.'    
  con.dispose()
Ejemplo n.º 14
0
 def destroyDomain(self, req):
     conn = util.getConnection()
     domain = self.getDomain(req, conn)
     ret = dict()
     ret['code'] = self.__class__.DOMAIN_ERROR_CODE_OK
     if domain == None:
         ret['code'] = self.__class__.DOMAIN_ERROR_CODE_NOT_FOUND
     elif domain.state(0)[0] == libvirt.VIR_DOMAIN_RUNNING:
         try:
             domain.destroy()
         except:
             ret['code'] = self.__class__.DOMAIN_ERROR_CODE_SYS_ERROR
         ret['state'] = domain.state(0)[0]
     else:
         ret['state'] = domain.state(0)[0]
     conn.close()
     req.write(json.dumps(ret))
     req.finish()
def getByTag(tag):
  print '''-- MOVIES GROUPED BY USER FOR A GIVE TAG --'''
  print '''tag: {}'''.format(tag)
  con = util.getConnection()
  tagCF = ColumnFamily(con, 'tag_videos_sup')

  movies = tagCF.get(tag.strip().lower())
  for key, val in movies.iteritems():
    username = key
    print '''
    {{
      {0}:'''.format(username)
    
    for k, v in val.iteritems():
      print '''\t{{{0}=> {1}}}'''.format(k, v)
    print '''
    }'''

  con.dispose()
def getByTag(tag):
  print '''-- MOVIES GROUPED BY USER FOR A GIVE TAG --'''
  print '''tag: {}'''.format(tag)
  con = util.getConnection()
  tagCF = ColumnFamily(con, 'tag_videos_composite')

  movies = tagCF.get(tag.strip().lower())
  for key, val in movies.iteritems():
    compositeCol = key
    print '([{0}],[{1}]) => {2}'.format(compositeCol[0], compositeCol[1], val)
    
  movieSlice = tagCF.get(tag.strip().lower(), column_start=("Kara", "The Croods:Kara"), column_finish=("Sally","Gx" ))
  #movieSlice = tagCF.get(tag.strip().lower(), column_start=("Kara", ), column_finish=(("Leo Scott",False),))
  print '-- SLICES --'
  for key, val in movieSlice.iteritems():
    compositeCol = key
    print '([{0}],[{1}]) => {2}'.format(compositeCol[0], compositeCol[1], val)
    

  con.dispose()
Ejemplo n.º 17
0
 def newNet(self, req):
     conn = util.getConnection()
     domain = self.getDomain(req, conn)
     ret = dict()
     ret['code'] = self.__class__.DOMAIN_ERROR_CODE_OK
     if domain == None:
         ret['code'] = self.__class__.DOMAIN_ERROR_CODE_NOT_FOUND
     else:
         if not req.args.has_key('source'):
             ret['code'] = self.__class__.DOMAIN_ERROR_CODE_BAD_PARAMETER
         else:
             doc = libxml2.parseDoc(
                 "<interface type='network'></interface>")
             root = doc.getRootElement()
             node = libxml2.newNode('mac')
             mac = req.args['mac'][0] if req.args.has_key(
                 'mac') else self.generateMAC()
             node.newProp('address', mac)
             root.addChild(node)
             try:
                 source = req.args['source'][0]
                 conn.networkLookupByName(source)
                 node = libxml2.newNode('source')
                 node.newProp('network', source)
                 root.addChild(node)
                 flag = libvirt.VIR_DOMAIN_AFFECT_CONFIG
                 if domain.state(0)[0] == libvirt.VIR_DOMAIN_RUNNING:
                     flag |= libvirt.VIR_DOMAIN_AFFECT_LIVE
                 if domain.attachDeviceFlags(root.serialize(), flag) > 0:
                     #libvirt.VIR_DOMAIN_AFFECT_CURRENT) > 0:
                     raise BaseException()
                 ret['source'] = source
                 ret['mac'] = mac
             except:
                 ret['code'] = self.__class__.DOMAIN_ERROR_CODE_SYS_ERROR
     conn.close()
     req.write(json.dumps(ret))
     req.finish()
def randomEvent(i, events):
  global THREAD_DONE
  event = random.choice(events)
  con = util.getConnection()
  eventsCF = ColumnFamily(con, 'event_log_mux')

  for j in range(10):
    event = random.choice(events)
    event['insert_time'] = time.time()
    user = event['user']
    muxid = random.randint(1, MUX)
    rowkey = '{0}:{1}'.format(user, muxid)
    timestamp = datetime.datetime.utcnow()
    colval = json.dumps(event)

    print '[Thread:{3}] Inserting: [{0}=> {{{1}:{2}}}]'.format(rowkey, timestamp, colval, i)
    eventsCF.insert(rowkey, {timestamp: colval})

    time.sleep(0.1) #100 milliseconds

  THREAD_DONE[i] = True
  print 'finishished insertion.'    
  con.dispose()
Ejemplo n.º 19
0
    def listVol(self, req):
        vols = list()
        conn = util.getConnection()
        try:
            if not req.args.has_key('pool'):
                raise BaseException()
            pool = conn.storagePoolLookupByName(req.args['pool'][0])
            vol_names = pool.listVolumes()
            for vol_name in vol_names:
                vol = pool.storageVolLookupByName(vol_name)
                d = dict()
                d['name'] = vol.name()
                d['path'] = vol.path()
                d['size'] = vol.info()[1]
                vols.append(d)
        except:
            pass
        finally:
            conn.close()
        req.write(json.dumps(vols))
        req.finish()

            
Ejemplo n.º 20
0
 def info(self, req):
     conn = util.getConnection()
     res = dict()
     info = conn.getInfo()
     res['arch'] = info[0]
     res['cpus'] = info[2]
     res['freq'] = info[3]
     f = file('/proc/uptime')
     with f:
         data = f.read()
         arr = data.split(' ')
         res['uptime'] = int(float(arr[0]))
     res['memory'] = conn.getMemoryStats(-1, 0)
     ifaces = util.listInterfaces()
     res['ifaces'] = list()
     for iface in ifaces:
         if iface[0] == 'lo':
             continue
         res['ifaces'].append(iface)
     res['net'] = self.listNet(conn)
     res['pool'] = self.listPool(conn)
     req.write(json.dumps(res))
     req.finish()
def getVids(username, max_length=0):
  con = util.getConnection()
  videoCF = ColumnFamily(con, 'videos')
  username_criteria = create_index_expression('user_name', username)
  length_criteria = create_index_expression('runtime_in_sec', max_length, LTE) #LTE? Less than or equals
 
  user_only_clause = create_index_clause([username_criteria], count=3) #just pull 3
  movies_by_user = videoCF.get_indexed_slices(user_only_clause)
  print '''-- movies for username: {}  --'''.format(username)
  print_movie(movies_by_user)

  user_runtime_clause = create_index_clause([username_criteria, length_criteria]) #pull all
  movies_by_user_runtime = videoCF.get_indexed_slices(user_runtime_clause)
  print '''-- movies for username: {} and length <= {} --'''.format(username, max_length)
  print_movie(movies_by_user_runtime)
  
  """
  # Intended to fail
  runtime_clause = create_index_clause([length_criteria]) # At least on equality neccessary!
  movies_by_runtime = videoCF.get_indexed_slices(runtime_clause)
  print '''-- movies for length <= {} --'''.format(max_length)
  print_movie(movies_by_runtime)
  """
  con.dispose()
def loadData():
  con = util.getConnection()
  cf = ColumnFamily(con, 'videos')
  movies = util.readCSV('data/movies')
  for movie in movies:
    title = movie[0]
    uploader = movie[1]
    runtime = int(movie[2]) #convert to match column validator
    tags = movie[3]
    rowKey = title+":"+uploader


    print "Inserting in videos: {}.".format(str(movie))
    cf.insert(
      rowKey, 
      {
        'title':title,
        'user_name':uploader,
        'runtime_in_sec':runtime,
        'tags_csv': tags
      })

  print 'finishished insertion.'    
  con.dispose()
Ejemplo n.º 23
0
 def newPool(self, req):
     ret = dict()
     ret['code'] = 0
     try:
         if not req.args.has_key('type'):
             ret['code'] = 1001
             ret['desc'] = "No type parameter"
             raise BaseException()
         pool_type = req.args['type'][0]
         if not req.args.has_key('name'):
             ret['code'] = 1001
             ret['desc'] = "No name parameter"
             raise BaseException()
         name = req.args['name'][0]
         doc = libxml2.parseDoc("<pool/>")
         root = doc.getRootElement()
         if pool_type == 'logical':
             root.newProp('type', 'logical')
             node = libxml2.newNode('name')
             node.setContent(name)
             root.addChild(node)
             node = libxml2.newNode('target')
             if not req.args.has_key('dev'):
                 ret['code'] = 1003
                 ret['desc'] = "Parameter dev invalid"
                 raise BaseException()
             dev = req.args['dev'][0]
             if not os.path.exists(dev):
                 ret['code'] = 1003
                 ret['desc'] = 'Parameter dev invalid'
                 raise BaseException()
             path = libxml2.newNode('path')
             path.setContent(dev)
             node.addChild(path)
             root.addChild(node)
         elif pool_type == 'dir':
             root.newProp('type', 'dir')
             node = libxml2.newNode('name')
             node.setContent(name)
             root.addChild(node)
             node = libxml2.newNode('target')
             path = libxml2.newNode('path')
             if not req.args.has_key('dev') or len(req.args['dev'][0]) == 0:
                 ret['code'] = 1003
                 ret['desc'] = "Parameter path invalid"
                 raise BaseException()
             dev = req.args['dev'][0]
             if not os.path.isdir(dev):
                 ret['code'] = 1003
                 ret['desc'] = "Path doesn't exists"
                 raise BaseException()
             path.setContent(dev)
             node.addChild(path)
             root.addChild(node)
         elif pool_type == 'netfs' or pool_type == 'iscsi':
             root.newProp('type', pool_type)
             node = libxml2.newNode('name')
             node.setContent(name)
             root.addChild(node)
             node = libxml2.newNode('source')
             if not req.args.has_key('host'):
                 ret['code'] = 1004
                 ret['desc'] = 'Parameter host invalid'
                 raise BaseException()
             subNode = libxml2.newNode('host')
             subNode.newProp('name', req.args['host'][0])
             node.addChild(subNode)
             if pool_type == 'netfs':
                 if not req.args.has_key('src_path'):
                     ret['code'] = 1004
                     ret['desc'] = 'Parameter src_path invalid'
                     raise BaseException()
                 subNode = libxml2.newNode('dir')
                 subNode.newProp('path', req.args['src_path'][0])
                 node.addChild(subNode)
             else:
                 if not req.args.has_key('device'):
                     ret['code'] = 1004
                     ret['desc'] = 'Parameter device invalid'
                     raise BaseException()
                 subNode = libxml2.newNode('device')
                 subNode.newProp('path', req.args['device'][0])
                 node.addChild(subNode)
                             
             root.addChild(node)
             if not req.args.has_key('target_path') or not os.path.isdir(req.args['target_path'][0]):
                 ret['code'] = '1004'
                 ret['desc'] = "Parameter target path invalid"
                 raise BaseException()
             
             node = libxml2.newNode('target')
             subNode = libxml2.newNode('path')
             subNode.setContent(req.args['target_path'][0])
             node.addChild(subNode)
             permission = libxml2.newNode('permissions')
             subNode = libxml2.newNode('owner')
             subNode.setContent('-1')
             permission.addChild(subNode)
             subNode = libxml2.newNode('group')
             subNode.setContent('-1')
             permission.addChild(subNode)
             subNode = libxml2.newNode('mode')
             subNode.setContent('0700')
             permission.addChild(subNode)
             node.addChild(permission)
             root.addChild(node)
         else:
             ret['code'] = 1002
             ret['desc'] = "Invalid storage type"
             raise BaseException()
         conn = util.getConnection()
         pool = None
         try:
             pool = conn.storagePoolDefineXML(root.serialize(), 0)
             if int(req.args['auto_start'][0]) != 0:
                 pool.setAutostart(True)
                 pool.create(0)
         except:
             ret['code'] = 10000
             ret['desc'] = 'Unable to create poool'
             if pool != None:
                 pool.undefine()
             conn.close()
             raise
         ret['name'] = name
         ret['type'] = pool_type
         doc = libxml2.parseDoc(pool.XMLDesc(0))
         nodes = doc.xpathEval('//uuid')
         if len(nodes) > 0:
             ret['uuid'] = nodes[0].getContent()
         nodes = doc.xpathEval('//capacity')
         if len(nodes) > 0:
             ret['capacity'] = nodes[0].getContent()
         nodes = doc.xpathEval('//allocation')
         if len(nodes) > 0:
             ret['allocation'] = nodes[0].getContent()
         nodes = doc.xpathEval('//available')
         if len(nodes) > 0:
             ret['available'] = nodes[0].getContent()
         conn.close()
     except:
         pass
     req.write(json.dumps(ret))
     req.finish()
Ejemplo n.º 24
0
    def domainInfo(self, req):
        conn = util.getConnection()
        domain = self.getDomain(req, conn)
        ret = dict()
        ret['code'] = self.__class__.DOMAIN_ERROR_CODE_OK
        if domain == None:
            ret['code'] = self.__class__.DOMAIN_ERROR_CODE_NOT_FOUND
        else:
            info = domain.info()
            ret['state'] = info[0]
            ret['max_memory'] = info[1]
            ret['memory'] = info[2]
            ret['vcpus'] = info[3]
            if info[0] == libvirt.VIR_DOMAIN_RUNNING:
                cpus = dict()
                cpus = domain.getCPUStats(1, 0)[0]
                cpus['cpus'] = [
                    i['cpu_time'] for i in domain.getCPUStats(0, 0)
                ]
                ret['cpus'] = cpus

            doc = libxml2.parseDoc(domain.XMLDesc(0))
            xml_disks = doc.xpathEval('//disk')
            disks = list()
            for xml_disk in xml_disks:
                if not xml_disk.hasProp('device'):
                    continue
                if xml_disk.prop('device') == 'cdrom':
                    cdrom = dict()
                    cdrom['type'] = xml_disk.prop('type')
                    sub_ele = xml_disk.firstElementChild()
                    while sub_ele:
                        if sub_ele.name == 'source':
                            cdrom['path'] = sub_ele.prop(
                                'file') if xml_disk.prop(
                                    'type') == 'file' else sub_ele.prop('dev')
                            break
                        sub_ele = sub_ele.nextElementSibling()

                    ret['cdrom'] = cdrom
                else:
                    disk = dict()
                    sub_ele = xml_disk.firstElementChild()
                    while sub_ele:
                        if sub_ele.name == 'source':
                            path = sub_ele.prop('file') if xml_disk.prop(
                                'type') == 'file' else sub_ele.prop('dev')
                            try:
                                vol = conn.storageVolLookupByPath(path)
                                disk['name'] = vol.name()
                                disk['size'] = vol.info()[1]
                                disk['pool'] = vol.storagePoolLookupByVolume(
                                ).name()
                            except:
                                pass
                        elif sub_ele.name == 'target':
                            disk['target'] = sub_ele.prop('dev')
                        sub_ele = sub_ele.nextElementSibling()
                    disks.append(disk)
            ret['disks'] = disks
            xml_nets = doc.xpathEval("//interface")
            nets = list()
            for xml_net in xml_nets:
                if xml_net.prop("type") != 'network':
                    continue
                net = dict()
                sub_ele = xml_net.firstElementChild()
                while sub_ele:
                    if sub_ele.name == 'mac':
                        net['mac'] = sub_ele.prop('address')
                    elif sub_ele.name == 'source':
                        net['source'] = sub_ele.prop('network')
                    elif sub_ele.name == 'alias':
                        net['serial'] = sub_ele.prop('name')[-1:]
                    elif sub_ele.name == 'target':
                        try:
                            net_stat = domain.interfaceStats(
                                sub_ele.prop('dev'))
                            stat_names = ('rx_bytes', 'rx_packets', 'rx_errs',
                                          'rx_drop', 'tx_bytes', 'tx_packets',
                                          'tx_errs', 'tx_drop')
                            net['stat'] = dict()
                            for i in xrange(len(net_stat)):
                                net['stat'][stat_names[i]] = net_stat[i]
                        except:
                            pass
                    sub_ele = sub_ele.nextElementSibling()
                nets.append(net)
            ret['net'] = nets
            req.write(json.dumps(ret))
            req.finish()
            conn.close()
Ejemplo n.º 25
0
    def parseDefinition(self, obj, req):
        name = obj.get('name')
        UUID = obj.get('uuid')
        if UUID == None or len(UUID) == 0:
            UUID = str(uuid.uuid4())
        if name == None or len(name) == 0:
            name = UUID
        memory = obj.get('memory')
        if memory == None:
            return self.respond(req,
                                self.__class__.DOMAIN_ERROR_CODE_BAD_PARAMETER,
                                "Memory value invalid")
        else:
            try:
                memory = int(memory)
            except:
                return self.respond(
                    req, self.__class__.DOMAIN_ERROR_CODE_BAD_PARAMETER,
                    "Memory value invalid")

        maxMemory = obj.get('maxMemory')
        if maxMemory == None:
            maxMemory = memory
        else:
            try:
                maxMemory = int(maxMemory)
            except:
                return self.respond(
                    req, self.__class__.DOMAIN_ERROR_CODE_BAD_PARAMETER,
                    "Max memory value invalid")

        vcpus = obj.get('vcpu')
        if vcpus == None:
            vcpus = 1
        else:
            try:
                vcpus = int(vcpus)
            except:
                return self.respond(
                    req, self.__class__.DOMAIN_ERROR_CODE_BAD_PARAMETER,
                    "vcpu value invalid")

        disks = obj.get('disks')
        if disks != None:
            if not isinstance(disks, list):
                return self.respond(
                    req, self.__class__.DOMAIN_ERROR_CODE_BAD_PARAMETER,
                    "Invalid disk parameter")
        cdrom = obj.get('cdrom')
        interfaces = obj.get('interfaces')
        if interfaces != None:
            if not isinstance(interfaces, list):
                return self.respond(
                    req, self.__class__.DOMAIN_ERROR_CODE_BAD_PARAMETER,
                    "Invalid interface parameter")
        try:
            conn = util.getConnection()
            domain = None
            try:
                domain = conn.lookupByName(str(name))
            except:
                pass
            if domain != None:
                return self.respond(
                    req, self.__class__.DOMAIN_ERROR_CODE_NAME_DUPLICATED,
                    "Domain name dulicated")
            nodeInfo = conn.getInfo()
            if vcpus > nodeInfo[2]:
                vcpus = nodeInfo[2]
            if memory > nodeInfo[1] * 1024:
                return self.respond(
                    req, self.__class__.DOMAIN_ERROR_CODE_INADEQUATE_MEMORY,
                    "Not enough memory")

            doc = libxml2.parseFile('/etc/cloudyfox/template.xml')
            root = doc.getRootElement()
            node = libxml2.newNode('name')
            node.setContent(name)
            root.addChild(node)
            node = libxml2.newNode("uuid")
            node.setContent(UUID)
            root.addChild(node)
            node = libxml2.newNode('memory')
            node.newProp("unit", "KiB")
            node.setContent(str(maxMemory))
            root.addChild(node)
            node = libxml2.newNode("currentMemory")
            node.newProp("unit", "KiB")
            node.setContent(str(memory))
            root.addChild(node)
            node = libxml2.newNode("vcpu")
            node.newProp("placement", "static")
            node.setContent(str(vcpus))
            root.addChild(node)
            result = doc.xpathEval("//devices")
            devices = result[0]
            if disks != None:
                diskIdx = 1
                for disk in disks:
                    if not os.path.exists(disk):
                        return self.respond(
                            req, self.__class__.DOMAIN_ERROR_CODE_NO_DISK,
                            "Unable to find disk")
                    diskNode = libxml2.newNode('disk')
                    st = os.stat(disk)
                    diskType = 'block' if stat.S_ISBLK(st.st_mode) else 'file'
                    diskNode.newProp('type', diskType)
                    diskNode.newProp('device', 'disk')
                    node = libxml2.newNode('source')
                    if diskType == 'block':
                        node.newProp('dev', disk)
                    else:
                        node.newProp('file', disk)
                    diskNode.addChild(node)
                    node = libxml2.newNode('target')
                    node.newProp('bus', 'virtio')
                    node.newProp('dev', 'vd' + chr(ord('a') + (diskIdx - 1)))
                    diskNode.addChild(node)
                    devices.addChild(diskNode)
                    diskIdx = diskIdx + 1

            cdromNode = libxml2.newNode('disk')
            cdromNode.newProp('type', 'file')
            cdromNode.newProp('device', 'cdrom')
            if cdrom != None and os.path.isfile(cdrom):
                node = libxml2.newNode('source')
                node.newProp('file', cdrom)
                cdromNode.addChild(node)
            node = libxml2.newNode('target')
            node.newProp('dev', 'hdc')
            node.newProp('bus', 'ide')
            cdromNode.addChild(node)
            devices.addChild(cdromNode)

            if interfaces != None:
                networks = conn.listNetworks()
                if len(networks) == 0:
                    return self.respond(
                        req, self.__class__.DOMAIN_ERROR_CODE_INTERFACE_ERROR,
                        "No network defined")
                for interface in interfaces:
                    if not isinstance(interface,
                                      dict) or not interface.has_key('source'):
                        return self.respond(
                            req,
                            self.__class__.DOMAIN_ERROR_CODE_INTERFACE_ERROR,
                            "No eth defined")
                    netName = interface['source']
                    if not netName in networks:
                        return self.respond(
                            req,
                            self.__class__.DOMAIN_ERROR_CODE_INTERFACE_ERROR,
                            "No such eth")
                    mac = interface.get('mac')
                    if mac == None:
                        mac = self.generateMAC()
                    netNode = libxml2.newNode('interface')
                    netNode.newProp('type', 'network')
                    node = libxml2.newNode('source')
                    node.newProp('network', netName)
                    netNode.addChild(node)
                    node = libxml2.newNode('mac')
                    node.newProp('address', mac)
                    netNode.addChild(node)
                    node = libxml2.newNode('model')
                    node.newProp('type', 'virtio')
                    netNode.addChild(node)
                    devices.addChild(netNode)
            xmlData = root.serialize()
            doc.freeDoc()
            return xmlData
        finally:
            conn.close()
Ejemplo n.º 26
0
 def attachDisk(self, req):
     conn = util.getConnection()
     domain = self.getDomain(req, conn)
     ret = dict()
     ret['code'] = self.__class__.DOMAIN_ERROR_CODE_OK
     if domain == None:
         ret['code'] = self.__class__.DOMAIN_ERROR_CODE_NOT_FOUND
     else:
         try:
             diskDoc = libxml2.parseDoc("<disk/>")
             diskRoot = diskDoc.getRootElement()
             node = libxml2.newNode('driver')
             node.newProp('name', 'qemu')
             node.newProp('type', 'raw')
             diskRoot.addChild(node)
             target_path = None
             if req.args.has_key('cdrom'):
                 if not os.path.exists(req.args['cdrom'][0]):
                     ret['code'] = self.__class__.DOMAIN_ERROR_CODE_SYS_ERROR
                     raise BaseException()
                 diskRoot.newProp('type', 'file')
                 diskRoot.newProp('device', 'cdrom')
                 node = libxml2.newNode('source')
                 node.newProp('file', req.args['cdrom'][0])
                 diskRoot.addChild(node)
                 node = libxml2.newNode('target')
                 node.newProp('dev', 'hdc')
                 node.newProp('tray', 'closed')
                 diskRoot.addChild(node)
                 node = libxml2.newNode('readonly')
                 diskRoot.addChild(node)
                 target_path = 'hdc'
             elif not req.args.has_key('disk'):
                 ret['code'] = self.__class__.DOMAIN_ERROR_CODE_SYS_ERROR
                 raise BaseException()
             else:
                 if domain.info()[0] == libvirt.VIR_DOMAIN_RUNNING:
                     ret['code'] = self.__class__.DOMAIN_ERROR_CODE_SYS_ERROR
                     raise BaseException()
                 domainDoc = libxml2.parseDoc(domain.XMLDesc(0))
                 xml_disks = domainDoc.xpathEval('//disk')
                 disk_idx = 1
                 for xml_disk in xml_disks:
                     if not xml_disk.hasProp('device'):
                         continue
                     if xml_disk.prop('device') == 'cdrom':
                         continue
                     disk_idx = disk_idx + 1
                 target_path = 'vd' + chr(ord('a') + (disk_idx - 1))
                 disk_name = req.args['disk'][0]
                 if not os.path.exists(disk_name):
                     ret['code'] = self.__class__.DOMAIN_ERROR_CODE_BAD_PARAMETER
                     raise BaseException()
                 vol = conn.storageVolLookupByPath(disk_name)
                 ret['size'] = vol.info()[1]
                 st = os.stat(disk_name)
                 if stat.S_ISBLK(st.st_mode):
                     diskRoot.newProp('type', 'block')
                 else:
                     diskRoot.newProp('type', 'file')
                 diskRoot.newProp('device', 'disk')
                 node = libxml2.newNode('source')
                 if stat.S_ISBLK(st.st_mode):
                     node.newProp('dev', disk_name)
                 else:
                     node.newProp('file', disk_name)
                 diskRoot.addChild(node)
                 node = libxml2.newNode('target')
                 node.newProp('dev', target_path)
                 node.newProp('bus', 'virtio')
                 diskRoot.addChild(node)
             if domain.attachDeviceFlags(
                     diskRoot.serialize(),
                     libvirt.VIR_DOMAIN_AFFECT_CURRENT) > 0:
                 raise BaseException()
             ret['target'] = target_path
         except:
             pass
     conn.close()
     req.write(json.dumps(ret))
     req.finish()