fix ips not set in sliver.ip
[plstackapi.git] / planetstack / openstack_observer / steps / sync_sliver_ips.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.sliver import Sliver
7 from util.logger import Logger, logging
8
9 class SyncSliverIps(OpenStackSyncStep):
10     provides=[Sliver]
11     requested_interval=0
12
13     def fetch_pending(self, deleted):
14         # Not supported yet
15         if (deleted):
16             return []
17         slivers = Sliver.objects.filter(ip=None)
18         return slivers
19
20     def sync_record(self, sliver):
21         driver = self.driver.client_driver(tenant=sliver.slice.name,
22                                            deployment=sliver.node.deployment.name)
23         servers = driver.shell.nova.servers.findall(id=sliver.instance_id)
24         if not servers:
25             return
26         server = servers[0]
27
28         # First try to grab the dedicated public address
29         # NOTE: "ext-net" is hardcoded here.
30         ip = None
31         ext_net_addrs = server.addresses.get("ext-net")\r
32         if ext_net_addrs:\r
33             ip = ext_net_addrs[0]["addr"]\r
34 \r
35         # If there was no public address, then grab the first address in the\r
36         # list.\r
37         if not ip:\r
38             if server.addresses:\r
39                 addrs = server.addresses.values()[0]\r
40                 if addrs:\r
41                     ip = addrs[0]["addr"]
42
43         if ip and ip!=sliver.ip:
44             sliver.ip = ip
45             sliver.save()
46             logger.info("saved sliver ip: %s %s" % (sliver, ip))