This tree was mixed up, with an old version of the EC2 Observer. This
[plstackapi.git] / planetstack / ec2_observer / steps / sync_slivers.py
1 import os
2 import json
3 import base64
4 from django.db.models import F, Q
5 from planetstack.config import Config
6 from ec2_observer.syncstep import SyncStep
7 from core.models.sliver import Sliver
8 from core.models.slice import SlicePrivilege, SliceDeployments
9 from core.models.network import Network, NetworkSlice, NetworkDeployments
10 from util.logger import Logger, logging
11 from ec2_observer.awslib import *
12 from core.models.site import *
13 from core.models.slice import *
14 import pdb
15
16 logger = Logger(level=logging.INFO)
17
18 class SyncSlivers(SyncStep):
19         provides=[Sliver]
20         requested_interval=0
21
22         def fetch_pending(self, deletion):
23                 all_slivers = Sliver.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
24                 my_slivers = [] 
25
26                 for sliver in all_slivers:
27                         sd = SliceDeployments.objects.filter(Q(slice=sliver.slice))
28                         if (sd):
29                                 if (sd.deployment.name=='Amazon EC2'):
30                                         my_slivers.append(sliver)
31                         if (sliver.node.deployment.name=='Amazon EC2'):
32                                 my_slivers.append(sliver)
33                 return my_slivers
34
35         def sync_record(self, sliver):
36                 logger.info("sync'ing sliver:%s deployment:%s " % (sliver, sliver.node.deployment))
37
38                 if not sliver.instance_id:
39                         # public keys
40                         slice_memberships = SlicePrivilege.objects.filter(slice=sliver.slice)
41                         pubkeys = [sm.user.public_key for sm in slice_memberships if sm.user.public_key]
42
43                         if sliver.creator.public_key:
44                                 pubkeys.append(sliver.creator.public_key)
45
46                         if sliver.slice.creator.public_key:
47                                 pubkeys.append(sliver.slice.creator.public_key) 
48
49                         # netowrks
50                         # include all networks available to the slice and/or associated network templates
51                         #nics = []
52                         #networks = [ns.network for ns in NetworkSlice.objects.filter(slice=sliver.slice)]      
53                         #network_deployments = NetworkDeployments.objects.filter(network__in=networks, 
54                                                                                                                                         #deployment=sliver.node.deployment)
55                         # Gather private networks first. This includes networks with a template that has
56                         # visibility = private and translation = none
57                         #for network_deployment in network_deployments:
58                         #       if network_deployment.network.template.visibility == 'private' and \
59                         #          network_deployment.network.template.translation == 'none': 
60                         #               nics.append({'net-id': network_deployment.net_id})
61         
62                         # now include network template
63                         #network_templates = [network.template.sharedNetworkName for network in networks \
64                         #                                        if network.template.sharedNetworkName]
65                         #for net in driver.shell.quantum.list_networks()['networks']:
66                         #       if net['name'] in network_templates: 
67                         #               nics.append({'net-id': net['id']}) 
68                         # look up image id
69
70                         instance_type = sliver.node.name.rsplit('.',1)[0]
71
72                         # Bail out of we don't have a key
73                         key_name = sliver.creator.email.lower().replace('@', 'AT').replace('.', '')
74                         key_sig = aws_run('ec2 describe-key-pairs')
75                         ec2_keys = key_sig['KeyPairs']
76                         key_found = False
77                         for key in ec2_keys:
78                                 if (key['KeyName']==key_name):
79                                         key_found = True
80                                         break
81
82                         if (not key_found):
83                                 # set backend_status
84                                 raise Exception('Will not sync sliver without key')
85
86                         image_id = sliver.image.path
87                         instance_sig = aws_run('ec2 run-instances --image-id %s --instance-type %s --count 1 --key-name %s --placement AvailabilityZone=%s'%(image_id,instance_type,key_name,sliver.node.site.name))
88                         sliver.instance_id = instance_sig['Instances'][0]['InstanceId']
89                         sliver.save()
90                         state = instance_sig['Instances'][0]['State']['Code']
91                         if (state==16):
92                                 sliver.ip = instance_sig['Instances'][0]['PublicIpAddress']
93                                 sliver.save()
94                         else:
95                                 # This status message should go into backend_status
96                                 raise Exception('Waiting for instance to start')
97                 else:
98                         ret = aws_run('ec2 describe-instances --instance-ids %s'%sliver.instance_id)
99                         state = ret['Reservations'][0]['Instances'][0]['State']['Code']
100                         if (state==16):
101                                 sliver.ip = ret['Reservations'][0]['Instances'][0]['PublicIpAddress']
102                                 sliver.save()
103