+ def create(name, rec = None):
+ logger.verbose('sliver_vs: {}: create'.format(name))
+ vref = rec['vref']
+ if vref is None:
+ # added by caglar
+ # band-aid for short period as old API doesn't have GetSliceFamily function
+ vref = "planetlab-f8-i386"
+ logger.log("sliver_vs: {}: ERROR - no vref attached, using hard-wired default {}"
+ .format(name, vref))
+
+ # used to look in /etc/planetlab/family,
+ # now relies on the 'GetSliceFamily' extra attribute in GetSlivers()
+ # which for legacy is still exposed here as the 'vref' key
+
+ # check the template exists -- there's probably a better way..
+ if not os.path.isdir ("/vservers/.vref/{}".format(vref)):
+ logger.log ("sliver_vs: {}: ERROR Could not create sliver - vreference image {} not found"
+ .format(name, vref))
+ return
+
+ # compute guest personality
+ try:
+ (x, y, arch) = vref.split('-')
+ # mh, this of course applies when 'vref' is e.g. 'netflow'
+ # and that's not quite right
+ except:
+ arch = 'i386'
+
+ def personality (arch):
+ return "linux64" if arch.find("64") >= 0 else "linux32"
+
+ command = []
+ # be verbose
+ command += ['/bin/bash', '-x', ]
+ command += ['/usr/sbin/vuseradd', ]
+ if 'attributes' in rec and 'isolate_loopback' in rec['attributes'] and rec['attributes']['isolate_loopback'] == '1':
+ command += [ "-i", ]
+ # the vsliver imge to use
+ command += [ '-t', vref, ]
+ # slice name
+ command += [ name, ]
+ logger.log_call(command, timeout=15*60)
+ # export slicename to the slice in /etc/slicename
+ with open('/vservers/{}/etc/slicename'.format(name), 'w') as slicenamefile:
+ slicenamefile.write(name)
+ with open('/vservers/{}/etc/slicefamily'.format(name), 'w') as slicefamilyfile:
+ slicefamilyfile.write(vref)
+ # set personality: only if needed (if arch's differ)
+ if tools.root_context_arch() != arch:
+ with open('/etc/vservers/{}/personality'.format(name), 'w') as personalityfile:
+ personalityfile.write(personality(arch)+"\n")
+ logger.log('sliver_vs: {}: set personality to {}'.format(name, personality(arch)))