blob: 4f74d28937fb9d8d4ced9a7d99e6406fe6a0ab51 [file] [log] [blame]
import os
import pdb
import sys
import tempfile
sys.path.append("/opt/tosca")
from translator.toscalib.tosca_template import ToscaTemplate
from core.models import Slice,Sliver,User,Flavor,Node,Image
from nodeselect import XOSNodeSelector
from imageselect import XOSImageSelector
class XOSTosca(object):
def __init__(self, tosca_yaml, parent_dir=None):
# TOSCA will look for imports using a relative path from where the
# template file is located, so we have to put the template file
# in a specific place.
if not parent_dir:
parent_dir = os.getcwd()
try:
(tmp_handle, tmp_pathname) = tempfile.mkstemp(dir=parent_dir)
os.write(tmp_handle, tosca_yaml)
os.close(tmp_handle)
self.template = ToscaTemplate(tmp_pathname)
finally:
os.remove(tmp_pathname)
#pdb.set_trace()
def execute(self, user):
for nodetemplate in self.template.nodetemplates:
self.execute_nodetemplate(user, nodetemplate)
def select_compute_node(self, user, v):
mem_size = v.get_property_value("mem_size")
num_cpus = v.get_property_value("num_cpus")
disk_size = v.get_property_value("disk_size")
# TODO: pick flavor based on parameters
flavor = Flavor.objects.get(name="m1.small")
compute_node = XOSNodeSelector(user, mem_size=mem_size, num_cpus=num_cpus, disk_size=disk_size).get_nodes(1)[0]
return (compute_node, flavor)
def select_image(self, user, v):
distribution = v.get_property_value("distribution")
version = v.get_property_value("version")
type = v.get_property_value("type")
architecture = v.get_property_value("architecture")
return XOSImageSelector(user, distribution=distribution, version=version, type=type, architecture=architecture).get_image()
def execute_nodetemplate(self, user, nodetemplate):
if (nodetemplate.type == "tosca.nodes.Slice"):
return
if (nodetemplate.type == "tosca.nodes.Service"):
return
if (nodetemplate.type != "tosca.nodes.Compute"):
raise Exception("I Don't know how to deal with %s" % nodetemplate.type)
host=None
flavor=None
image=None
sliceName = None
for reqs in nodetemplate.requirements:
for (k,v) in reqs.items():
print v
if (v["relationship"] == "tosca.relationships.MemberOfSlice"):
sliceName = v["node"]
if not sliceName:
raise Exception("No slice requirement for node %s" % nodetemplate.name)
slice = Slice.objects.filter(name=sliceName)
if not slice:
raise Exception("Could not find slice %s" % sliceName)
slice = slice[0]
capabilities = nodetemplate.get_capabilities()
for (k,v) in capabilities.items():
if (k=="host"):
(compute_node, flavor) = self.select_compute_node(user, v)
elif (k=="os"):
image = self.select_image(user, v)
if not compute_node:
raise Exception("Failed to pick a host")
if not image:
raise Exception("Failed to pick an image")
if not flavor:
raise Exception("Failed to pick a flavor")
sliver = Sliver(deployment = compute_node.site_deployment.deployment,
node = compute_node,
flavor = flavor,
slice = slice,
image = image)
sliver.caller = user
print "XXX save sliver" #sliver.save()