blob: e2c63bc6b57ccf4f780afdcc40100368901a6c9c [file] [log] [blame]
import os
import base64
import random
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 SiteDeployment, Controller
from util.logger import Logger, logging
logger = Logger(level=logging.INFO)
class SyncNodes(OpenStackSyncStep):
provides=[Node]
requested_interval=0
def fetch_pending(self, deleted):
# Nodes come from the back end
# You can't delete them
if (deleted):
return []
# collect local nodes
controllers = Controller.objects.all()
nodes = Node.objects.all()
node_hostnames = [node.name for node in nodes]
# fetch all nodes from each controller
new_nodes = []
for controller in controllers:
try:
controller_site_deployments = SiteDeployment.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 the first one
node = Node(name=compute_node.hypervisor_hostname,
site_deployment=site_deployment)
new_nodes.append(node)
return new_nodes
def sync_record(self, node):
node.save()