cb1d52a95121935dedea05a44c01a4adf526b9d1
[plstackapi.git] / planetstack / observer / steps / sync_networks.py
1 import os
2 import base64
3 from django.db.models import F, Q
4 from planetstack.config import Config
5 from observer.openstacksyncstep import OpenStackSyncStep
6 from core.models.network import *
7 from util.logger import Logger, logging
8
9 logger = Logger(level=logging.INFO)
10
11 class SyncNetworks(OpenStackSyncStep):
12     provides=[Network]
13     requested_interval = 0
14
15     def fetch_pending(self):
16         return Network.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
17
18     def save_network(self, network):
19         if not network.network_id and network.template.sharedNetworkName:
20                 network.network_id = network.template.sharedNetworkId
21
22         if not network.network_id:
23             network_name = network.name
24
25             # create network
26             os_network = self.driver.create_network(network_name, shared=True)
27             network.network_id = os_network['id']
28
29             # create router
30             router = self.driver.create_router(network_name)
31             network.router_id = router['id']
32
33             # create subnet
34             next_subnet = self.get_next_subnet()
35             cidr = str(next_subnet.cidr)
36             ip_version = next_subnet.version
37             start = str(next_subnet[2])
38             end = str(next_subnet[-2])
39             subnet = self.driver.create_subnet(name=network_name,
40                                                network_id = network.network_id,
41                                                cidr_ip = cidr,
42                                                ip_version = ip_version,
43                                                start = start,
44                                                end = end)
45             network.subnet = cidr
46             network.subnet_id = subnet['id']
47             # add subnet as interface to slice's router
48             self.driver.add_router_interface(router['id'], subnet['id'])
49             # add external route
50             self.driver.add_external_route(subnet)
51             logger.info("created private subnet (%s) for network: %s" % (cidr, network))
52         else:
53             (network.subnet_id, network.subnet) = self.driver.get_network_subnet(network.network_id)
54             logger.info("sync'ed subnet (%s) for network: %s" % (network.subnet, network))
55             network.save()
56
57     def sync_record(self, network):
58         if network.owner and network.owner.creator:
59             try:
60                 # update manager context
61                 real_driver = self.driver
62                 self.driver = self.driver.client_driver(network.owner.creator, network.owner.name)
63                 self.save_network(network)
64                 self.driver = real_driver
65                 logger.info("saved network: %s" % (network))
66             except Exception,e:
67                 logger.log_exc("save network failed: %s" % network)    
68                 raise e
69