blob: 20798593e2437ed5652895e8bfca6ac2604470fc [file] [log] [blame]
Sapan Bhatia26d40bc2014-05-12 15:28:02 -04001import os
Sapan Bhatia511ea5f2014-07-21 22:53:58 -04002import json
Sapan Bhatia26d40bc2014-05-12 15:28:02 -04003import base64
4from django.db.models import F, Q
5from planetstack.config import Config
Sapan Bhatia511ea5f2014-07-21 22:53:58 -04006from ec2_observer.syncstep import SyncStep
Sapan Bhatia26d40bc2014-05-12 15:28:02 -04007from core.models.sliver import Sliver
8from core.models.slice import SlicePrivilege, SliceDeployments
9from core.models.network import Network, NetworkSlice, NetworkDeployments
10from util.logger import Logger, logging
Sapan Bhatia511ea5f2014-07-21 22:53:58 -040011from ec2_observer.awslib import *
12from core.models.site import *
13from core.models.slice import *
14import pdb
Sapan Bhatia26d40bc2014-05-12 15:28:02 -040015
16logger = Logger(level=logging.INFO)
17
Sapan Bhatia511ea5f2014-07-21 22:53:58 -040018class SyncSlivers(SyncStep):
19 provides=[Sliver]
20 requested_interval=0
Sapan Bhatia26d40bc2014-05-12 15:28:02 -040021
Sapan Bhatia511ea5f2014-07-21 22:53:58 -040022 def fetch_pending(self, deletion):
23 all_slivers = Sliver.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
24 my_slivers = []
Sapan Bhatia26d40bc2014-05-12 15:28:02 -040025
Sapan Bhatia511ea5f2014-07-21 22:53:58 -040026 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
Sapan Bhatia26d40bc2014-05-12 15:28:02 -040034
Sapan Bhatia511ea5f2014-07-21 22:53:58 -040035 def sync_record(self, sliver):
36 logger.info("sync'ing sliver:%s deployment:%s " % (sliver, sliver.node.deployment))
Sapan Bhatia26d40bc2014-05-12 15:28:02 -040037
Sapan Bhatia511ea5f2014-07-21 22:53:58 -040038 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]
Sapan Bhatia26d40bc2014-05-12 15:28:02 -040042
Sapan Bhatia511ea5f2014-07-21 22:53:58 -040043 if sliver.creator.public_key:
44 pubkeys.append(sliver.creator.public_key)
Sapan Bhatia26d40bc2014-05-12 15:28:02 -040045
Sapan Bhatia511ea5f2014-07-21 22:53:58 -040046 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()
Sapan Bhatia26d40bc2014-05-12 15:28:02 -0400103