Steps in which deletion is not supported have to return an empty list
[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 Site, Deployment
10
11 class SyncNodes(OpenStackSyncStep):
12     provides=[Node]
13     requested_interval=0
14
15     def fetch_pending(self, deleted):
16         # Nodes come from the back end
17         # You can't delete them
18         if (deleted):
19             return []
20
21         # collect local nodes
22         sites = Site.objects.all()
23         nodes = Node.objects.all()
24         node_hostnames  = [node.name for node in nodes]
25
26         # fetch all nodes from each deployment 
27         deployments = Deployment.objects.all()
28         new_nodes = []
29         for deployment in deployments:
30             driver = self.driver.admin_driver(deployment=deployment.name)
31             compute_nodes = driver.shell.nova.hypervisors.list()
32             for compute_node in compute_nodes:
33                 if compute_node.hypervisor_hostname not in node_hostnames:
34                     # XX TODO:figure out how to correctly identify a node's site.
35                     # XX pick a random site to add the node to for now
36                     site_index = random.randint(0, len(sites))
37                     node = Node(name=compute_node.hypervisor_hostname,
38                                 site=sites[site_index], deployment=deployment)
39                     new_nodes.append(node)
40
41         return new_nodes    
42                  
43
44     def sync_record(self, node):
45         node.save()
46