from sfa.trust.credential import Credential
from sfa.plc.api import SfaAPI
from sfa.util.plxrn import hrn_to_pl_slicename, slicename_to_hrn
+from sfa.util.callids import Callids
##
# The data structure used to represent a cloud.
cloudURL = cloudURL.replace('http://', '')
(cloud['ip'], parts) = cloudURL.split(':')
- # Read the bundle images config file.
- if not os.path.exists('/etc/sfa/bundle_image.conf') and \
- not os.path.exists('bundle_image.conf'):
- print >>sys.stderr, 'Could not find bundle_image.conf'
- raise Exception('Could not find bundle_image.conf')
- imageBundleParser = ConfigParser()
- imageBundleParser.read(['/etc/sfa/bundle_image.conf', 'bundle_image.conf'])
+ # Create image bundles
+ images = getEucaConnection().get_all_images()
+ cloud['images'] = images
cloud['imageBundles'] = {}
- for bundle in imageBundleParser.sections():
- info = dict(imageBundleParser.items(bundle))
- cloud['imageBundles'][bundle] = info
+ for i in images:
+ if i.type != 'machine' or i.kernel_id is None: continue
+ name = os.path.dirname(i.location)
+ detail = {'imageID' : i.id, 'kernelID' : i.kernel_id, 'ramdiskID' : i.ramdisk_id}
+ cloud['imageBundles'][name] = detail
# Initialize sqlite3 database.
dbPath = '/etc/sfa/db'
xml << eucaInst['state']
with xml.public_dns:
xml << eucaInst['public_dns']
- with xml.keypair:
- xml << eucaInst['key']
def __imageBundleXML(self, bundles):
xml = self.eucaRSpec
with xml.bundles:
for bundle in bundles.keys():
- print >>sys.stderr, 'bundle: %r' % bundle
- sys.stderr.flush()
with xml.bundle(id=bundle):
- with xml.description:
- xml << bundles[bundle]['description']
+ xml << ''
##
# Creates the Images stanza.
with xml.cloud(id=cloud['name']):
with xml.ipv4:
xml << cloud['ip']
- self.__keyPairsXML(cloud['keypairs'])
- self.__imagesXML(cloud['images'])
+ #self.__keyPairsXML(cloud['keypairs'])
+ #self.__imagesXML(cloud['images'])
self.__imageBundleXML(cloud['imageBundles'])
self.__clustersXML(cloud['clusters'])
return str(xml)
return clusterList
-def get_rspec(api, creds, options):
+def ListResources(api, creds, options, call_id):
+ if Callids().already_handled(call_id): return ""
global cloud
# get slice's hrn from options
xrn = options.get('geni_slice_urn', '')
# Images
images = conn.get_all_images()
cloud['images'] = images
+ cloud['imageBundles'] = {}
+ for i in images:
+ if i.type != 'machine' or i.kernel_id is None: continue
+ name = os.path.dirname(i.location)
+ detail = {'imageID' : i.id, 'kernelID' : i.kernel_id, 'ramdiskID' : i.ramdisk_id}
+ cloud['imageBundles'][name] = detail
# Key Pairs
keyPairs = conn.get_all_key_pairs()
"""
Hook called via 'sfi.py create'
"""
-def create_slice(api, xrn, creds, xml, users):
+def CreateSliver(api, xrn, creds, xml, users, call_id):
+ if Callids().already_handled(call_id): return ""
+
global cloud
hrn = urn_to_hrn(xrn)[0]
conn = getEucaConnection()
if not conn:
print >>sys.stderr, 'Error: Cannot create a connection to Eucalyptus'
- return False
+ return ""
# Validate RSpec
schemaXML = ET.parse(EUCALYPTUS_RSPEC_SCHEMA)
if requests:
# Get all the public keys associate with slice.
pubKeys = getKeysForSlice(s.slice_hrn)
- print sys.stderr, "Passing the following keys to the instance:\n%s" % pubKeys
+ print >>sys.stderr, "Passing the following keys to the instance:\n%s" % pubKeys
+ sys.stderr.flush()
for req in requests:
vmTypeElement = req.getparent()
instType = vmTypeElement.get('name')
numInst = int(req.find('instances').text)
- instKernel = req.find('kernel_image').get('id')
- instDiskImg = req.find('disk_image').get('id')
- instKey = req.find('keypair').text
- ramDiskElement = req.find('ramdisk')
- ramDiskAttr = ramDiskElement.attrib
- if 'id' in ramDiskAttr:
- instRamDisk = ramDiskAttr['id']
- else:
- instRamDisk = None
+ bundleName = req.find('bundle').text
+ if not cloud['imageBundles'][bundleName]:
+ print >>sys.stderr, 'Cannot find bundle %s' % bundleName
+ bundleInfo = cloud['imageBundles'][bundleName]
+ instKernel = bundleInfo['kernelID']
+ instDiskImg = bundleInfo['imageID']
+ instRamDisk = bundleInfo['ramdiskID']
+ instKey = None
# Create the instances
for i in range(0, numInst):
inst_type = instType)
eucaInst.reserveInstance(conn, pubKeys)
- return True
+ # xxx - should return altered rspec
+ # with enough data for the client to understand what's happened
+ return xml
def main():
init_server()
#theRSpec = None
#with open(sys.argv[1]) as xml:
# theRSpec = xml.read()
- #create_slice(None, 'planetcloud.pc.test', theRSpec)
+ #CreateSliver(None, 'planetcloud.pc.test', theRSpec, 'call-id-cloudtest')
- #rspec = get_rspec('euca', 'planetcloud.pc.test', 'planetcloud.pc.marcoy')
+ #rspec = ListResources('euca', 'planetcloud.pc.test', 'planetcloud.pc.marcoy', 'test_euca')
#print rspec
print getKeysForSlice('gc.gc.test1')