Fix bugs. Reefactor.
[plstackapi.git] / planetstack / openstack_observer / steps / sync_nodes.py
1 import os
2 import base64
3 import random
4 from datetime import datetime
5 from django.db.models import F, Q
6 from planetstack.config import Config
7 from observer.openstacksyncstep import OpenStackSyncStep
8 from core.models.node import Node
9 from core.models.site import SiteDeployments, Controller, SiteDeployments
10 from util.logger import Logger, logging
11
12 logger = Logger(level=logging.INFO)
13
14 class SyncNodes(OpenStackSyncStep):
15     provides=[Node]
16     requested_interval=0
17
18     def fetch_pending(self, deleted):
19         # Nodes come from the back end
20         # You can't delete them
21         if (deleted):
22             return []
23
24         # collect local nodes
25         controllers = Controller.objects.all()
26         nodes = Node.objects.all()
27         node_hostnames = [node.name for node in nodes]
28
29         # fetch all nodes from each controller
30         new_nodes = []
31         for controller in controllers:
32             try:
33                 controller_site_deployments = SiteDeployments.objects.filter(controller=controller)[0]
34             except IndexError:
35                 raise Exception("Controller %s not bound to any site deployments"%controller.name)
36
37             site_deployment = controller_site_deployments.site_deployment
38             if (not site_deployment):
39                 raise Exception('Controller without Site Deployment: %s'%controller.name)
40
41             try:
42                 driver = self.driver.admin_driver(controller=controller,tenant='admin')
43                 compute_nodes = driver.shell.nova.hypervisors.list()
44             except:
45                 logger.log_exc("Failed to get nodes from controller %s" % str(controller))
46                 continue
47
48             for compute_node in compute_nodes:
49                 if compute_node.hypervisor_hostname not in node_hostnames:
50                     # XX TODO:figure out how to correctly identify a node's site.
51                     # XX pick the first one
52                     node = Node(name=compute_node.hypervisor_hostname,
53                                 site_deployment=site_deployment)
54                     new_nodes.append(node)
55
56         return new_nodes    
57                  
58
59     def sync_record(self, node):
60         node.save()
61