import os
import base64
import random
-from datetime import datetime
+from datetime import datetime
from django.db.models import F, Q
from planetstack.config import Config
from observer.openstacksyncstep import OpenStackSyncStep
from core.models.node import Node
-from core.models.site import Site, Deployment
+from core.models.site import SiteDeployments, Controller, SiteDeployments
+from util.logger import Logger, logging
+
+logger = Logger(level=logging.INFO)
class SyncNodes(OpenStackSyncStep):
provides=[Node]
return []
# collect local nodes
- sites = Site.objects.all()
+ controllers = Controller.objects.all()
nodes = Node.objects.all()
- node_hostnames = [node.name for node in nodes]
+ node_hostnames = [node.name for node in nodes]
- # fetch all nodes from each deployment
- deployments = Deployment.objects.all()
+ # fetch all nodes from each controller
new_nodes = []
- for deployment in deployments:
- driver = self.driver.admin_driver(deployment=deployment.name)
- compute_nodes = driver.shell.nova.hypervisors.list()
+ for controller in controllers:
+ try:
+ controller_site_deployments = SiteDeployments.objects.filter(controller=controller)[0]
+ except IndexError:
+ raise Exception("Controller %s not bound to any site deployments"%controller.name)
+
+ site_deployment = controller_site_deployments.site_deployment
+ if (not site_deployment):
+ raise Exception('Controller without Site Deployment: %s'%controller.name)
+
+ try:
+ driver = self.driver.admin_driver(controller=controller,tenant='admin')
+ compute_nodes = driver.shell.nova.hypervisors.list()
+ except:
+ logger.log_exc("Failed to get nodes from controller %s" % str(controller))
+ continue
+
for compute_node in compute_nodes:
if compute_node.hypervisor_hostname not in node_hostnames:
# XX TODO:figure out how to correctly identify a node's site.
- # XX pick a random site to add the node to for now
- site_index = random.randint(0, len(sites))
+ # XX pick the first one
node = Node(name=compute_node.hypervisor_hostname,
- site=sites[site_index], deployment=deployment)
+ site_deployment=site_deployment)
new_nodes.append(node)
return new_nodes