Wide range of debugging changes
[plstackapi.git] / planetstack / observer / steps / sync_network_slivers.py
1 import os
2 import base64
3 from planetstack.config import Config
4 from observer.openstacksyncstep import OpenStackSyncStep
5 from core.models.network import *
6
7 class SyncNetworkSlivers(OpenStackSyncStep):
8         requested_interval = 3600
9         provides=[NetworkSliver]
10
11         def call(self):
12                 networkSlivers = NetworkSliver.objects.all()
13                 networkSlivers_by_id = {}
14                 networkSlivers_by_port = {}
15                 for networkSliver in networkSlivers:
16                         networkSlivers_by_id[networkSliver.id] = networkSliver
17                         networkSlivers_by_port[networkSliver.port_id] = networkSliver
18
19                 networks = Network.objects.all()
20                 networks_by_id = {}
21                 for network in networks:
22                         networks_by_id[network.network_id] = network
23
24                 slivers = Sliver.objects.all()
25                 slivers_by_instance_id = {}
26                 for sliver in slivers:
27                         slivers_by_instance_id[sliver.instance_id] = sliver
28
29                 ports = self.manager.driver.shell.quantum.list_ports()["ports"]
30                 for port in ports:
31                         if port["id"] in networkSlivers_by_port:
32                                 # we already have it
33                                 print "already accounted for port", port["id"]
34                                 continue
35
36                         if port["device_owner"] != "compute:nova":
37                                 # we only want the ports that connect to instances
38                                 continue
39
40                         network = networks_by_id.get(port['network_id'], None)
41                         if not network:
42                                 #print "no network for port", port["id"], "network", port["network_id"]
43                                 continue
44
45                         sliver = slivers_by_instance_id.get(port['device_id'], None)
46                         if not sliver:
47                                 print "no sliver for port", port["id"], "device_id", port['device_id']
48                                 continue
49
50                         if network.template.sharedNetworkId is not None:
51                                 # If it's a shared network template, then more than one network
52                                 # object maps to the quantum network. We have to do a whole bunch
53                                 # of extra work to find the right one.
54                                 networks = network.template.network_set.all()
55                                 network = None
56                                 for candidate_network in networks:
57                                         if (candidate_network.owner == sliver.slice):
58                                                 print "found network", candidate_network
59                                                 network = candidate_network
60
61                                 if not network:
62                                         print "failed to find the correct network for a shared template for port", port["id"], "network", port["network_id"]
63                                         continue
64
65                         if not port["fixed_ips"]:
66                                 print "port", port["id"], "has no fixed_ips"
67                                 continue
68
69 #                        print "XXX", port
70
71                         ns = NetworkSliver(network=network,
72                                                            sliver=sliver,
73                                                            ip=port["fixed_ips"][0]["ip_address"],
74                                                            port_id=port["id"])
75                         ns.save()