blob: a794ccf1b0896aab335cae3c5f06f95a3a7599f2 [file] [log] [blame]
Scott Baker105b6b72014-05-12 10:40:25 -07001import os
2import base64
3from django.db.models import F, Q
4from planetstack.config import Config
5from observer.openstacksyncstep import OpenStackSyncStep
6from core.models.sliver import Sliver
7from core.models.slice import Slice, SlicePrivilege, SliceDeployments
8from core.models.network import Network, NetworkSlice, NetworkDeployments
9from util.logger import Logger, logging
10
11logger = Logger(level=logging.INFO)
12
13class SyncSlivers(OpenStackSyncStep):
14 provides=[Sliver]
15 requested_interval=0
16
17 def fetch_pending(self):
18 return Sliver.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
19
20 def sync_record(self, sliver):
21 logger.info("sync'ing sliver:%s deployment:%s " % (sliver, sliver.node.deployment))
22 metadata_update = {}
23 if ("numberCores" in sliver.changed_fields):
24 metadata_update["cpu_cores"] = str(sliver.numberCores)
25
26 for tag in sliver.slice.tags.all():
27 if tag.name.startswith("sysctl-"):
28 metadata_update[tag.name] = tag.value
29
30 if not sliver.instance_id:
31 driver = self.driver.client_driver(caller=sliver.creator, tenant=sliver.slice.name, deployment=sliver.deploymentNetwork.name)
32 # public keys
33 slice_memberships = SlicePrivilege.objects.filter(slice=sliver.slice)
34 pubkeys = [sm.user.public_key for sm in slice_memberships if sm.user.public_key]
35 if sliver.creator.public_key:
36 pubkeys.append(sliver.creator.public_key)
37 if sliver.slice.creator.public_key:
38 pubkeys.append(sliver.slice.creator.public_key)
39 # netowrks
40 # include all networks available to the slice and/or associated network templates
41 nics = []
42 networks = [ns.network for ns in NetworkSlice.objects.filter(slice=sliver.slice)]
43 network_deployments = NetworkDeployments.objects.filter(network__in=networks,
44 deployment=sliver.node.deployment)
45 # Gather private networks first. This includes networks with a template that has
46 # visibility = private and translation = none
47 for network_deployment in network_deployments:
48 if network_deployment.network.template.visibility == 'private' and \
49 network_deployment.network.template.translation == 'none':
50 nics.append({'net-id': network_deployment.net_id})
51
52 # now include network template
53 network_templates = [network.template.sharedNetworkName for network in networks \
54 if network.template.sharedNetworkName]
55 #logger.info("%s %s %s %s" % (driver.shell.quantum.username, driver.shell.quantum.password, driver.shell.quantum.tenant, driver.shell.quantum.url))
56 for net in driver.shell.quantum.list_networks()['networks']:
57 if net['name'] in network_templates:
58 nics.append({'net-id': net['id']})
59
60 file("/tmp/scott-manager","a").write("slice: %s\nreq: %s\n" % (str(sliver.slice.name), str(nics)))
61
62 # look up image id
63 deployment_driver = self.driver.admin_driver(deployment=sliver.deploymentNetwork.name)
64 image_id = None
65 images = deployment_driver.shell.glance.get_images()
66 for image in images:
67 if image['name'] == sliver.image.name:
68 image_id = image['id']
69
70 # look up key name at the deployment
71 # create/fetch keypair
72 keyname = None
73 if sliver.creator.public_key:
74 keyname = sliver.creator.email.lower().replace('@', 'AT').replace('.', '') +\
75 sliver.slice.name
76 key_fields = {'name': keyname,
77 'public_key': sliver.creator.public_key}
78 driver.create_keypair(**key_fields)
79
80 instance = driver.spawn_instance(name=sliver.name,
81 key_name = keyname,
82 image_id = image_id,
83 hostname = sliver.node.name,
84 pubkeys = pubkeys,
85 nics = nics )
86 sliver.instance_id = instance.id
87 sliver.instance_name = getattr(instance, 'OS-EXT-SRV-ATTR:instance_name')
88 sliver.save()
89
90 if sliver.instance_id and metadata_update:
91 driver.update_instance_metadata(sliver.instance_id, metadata_update)
92