from sfa.util.namespace import *
from sfa.util.rspec import RSpec
from sfa.server.registry import Registries
-from sfa.plc.nodes import *
import boto
from boto.ec2.regioninfo import RegionInfo
# @param clusters Clusters information.
#
def __clustersXML(self, clusters):
+ cloud = self.cloudInfo
xml = self.eucaRSpec
+
for cluster in clusters:
instances = cluster['instances']
with xml.cluster(id=cluster['name']):
xml << str(inst[5])
if inst[0] == 'm1.small':
self.__requestXML(1, 'emi-88760F45', 'eki-F26610C6', 'cortex')
-
+ if 'instances' in cloud and inst[0] in cloud['instances']:
+ existingEucaInstances = cloud['instances'][inst[0]]
+ with xml.euca_instances:
+ for eucaInst in existingEucaInstances:
+ with xml.euca_instance(id=eucaInst['id']):
+ with xml.state:
+ xml << eucaInst['state']
+ with xml.public_dns:
+ xml << eucaInst['public_dns']
+ with xml.keypair:
+ xml << eucaInst['key']
##
# Creates the Images stanza.
# Key Pairs
keyPairs = conn.get_all_key_pairs()
cloud['keypairs'] = keyPairs
+
+ if hrn:
+ instanceId = []
+ instances = []
+
+ # Get the instances that belong to the given slice from sqlite3
+ # XXX use getOne() in production because the slice's hrn is supposed
+ # to be unique. For testing, uniqueness is turned off in the db.
+ # If the slice isn't found in the database, create a record for the
+ # slice.
+ matchedSlices = list(Slice.select(Slice.q.slice_hrn == hrn))
+ if matchedSlices:
+ theSlice = matchedSlices[-1]
+ else:
+ theSlice = Slice(slice_hrn = hrn)
+ for instance in theSlice.instances:
+ instanceId.append(instance.instance_id)
+
+ # Get the information about those instances using their ids.
+ if len(instanceId) > 0:
+ reservations = conn.get_all_instances(instanceId)
+ else:
+ reservations = []
+ for reservation in reservations:
+ for instance in reservation.instances:
+ instances.append(instance)
+
+ # Construct a dictory for the EucaRSpecBuilder
+ instancesDict = {}
+ for instance in instances:
+ instList = instancesDict.setdefault(instance.instance_type, [])
+ instInfoDict = {}
+
+ instInfoDict['id'] = instance.id
+ instInfoDict['public_dns'] = instance.public_dns_name
+ instInfoDict['state'] = instance.state
+ instInfoDict['key'] = instance.key_name
+
+ instList.append(instInfoDict)
+ cloud['instances'] = instancesDict
+
except EC2ResponseError, ec2RespErr:
errTree = ET.fromstring(ec2RespErr.body)
errMsgE = errTree.find('.//Message')
rspec = EucaRSpecBuilder(cloud).toXML()
+ # Remove the instances records so next time they won't
+ # show up.
+ if 'instances' in cloud:
+ del cloud['instances']
+
return rspec
"""
print >>sys.stderr, 'Error: Cannot create a connection to Eucalyptus'
return False
- # Get the slice from db or create one.
- # XXX: For testing purposes, I'll just create the slice.
- #s = Slice.select(Slice.q.slice_hrn == hrn).getOne(None)
- #if s is None:
- s = Slice(slice_hrn = hrn)
-
# Validate RSpec
schemaXML = ET.parse(EUCALYPTUS_RSPEC_SCHEMA)
rspecValidator = ET.RelaxNG(schemaXML)
if not rspecValidator(rspecXML):
error = rspecValidator.error_log.last_error
message = '%s (line %s)' % (error.message, error.line)
- raise InvalidRSpec(message)
+ # XXX: InvalidRSpec is new. Currently, I am not working with Trunk code.
+ #raise InvalidRSpec(message)
+ raise Exception(message)
- # Process the RSpec
+ # Get the slice from db or create one.
+ s = Slice.select(Slice.q.slice_hrn == hrn).getOne(None)
+ if s is None:
+ s = Slice(slice_hrn = hrn)
+
+ # Process any changes in existing instance allocation
+ pendingRmInst = []
+ for sliceInst in s.instances:
+ pendingRmInst.append(sliceInst.instance_id)
+ existingInstGroup = rspecXML.findall('.//euca_instances')
+ for instGroup in existingInstGroup:
+ for existingInst in instGroup:
+ if existingInst.get('id') in pendingRmInst:
+ pendingRmInst.remove(existingInst.get('id'))
+ for inst in pendingRmInst:
+ print >>sys.stderr, 'Instance %s will be terminated' % inst
+ dbInst = EucaInstance.select(EucaInstance.q.instance_id == inst).getOne(None)
+ dbInst.destroySelf()
+ conn.terminate_instances(pendingRmInst)
+
+ # Process new instance requests
requests = rspecXML.findall('.//request')
for req in requests:
vmTypeElement = req.getparent()
theRSpec = xml.read()
create_slice(None, 'planetcloud.pc.test', theRSpec)
- #rspec = get_rspec('euca', 'hrn:euca', 'oring_hrn')
+ #rspec = get_rspec('euca', 'planetcloud.pc.test', 'planetcloud.pc.marcoy')
#print rspec
if __name__ == "__main__":