import os
import base64
from collections import defaultdict
from django.db.models import F, Q
from planetstack.config import Config
from observer.openstacksyncstep import OpenStackSyncStep
from core.models import Controller
from core.models import Image, ControllerImages
from util.logger import Logger, logging
from observer.ansible import *

logger = Logger(level=logging.INFO)

class SyncControllerImages(OpenStackSyncStep):
    provides=[ControllerImages]
    requested_interval=0

    def fetch_pending(self, deleted):
        if (deleted):
            return []

        # now we return all images that need to be enacted
        return ControllerImages.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))

    def sync_record(self, controller_image):
        logger.info("Working on image %s on controller %s" % (controller_image.image.name, controller_image.controller))
	image_fields = {'endpoint':controller_image.controller.auth_url,
			'admin_user':controller_image.controller.admin_user,
			'admin_password':controller_image.controller.admin_password,
			'name':controller_image.image.name,
			'filepath':controller_image.image.path,
	                'ansible_tag': '%s@%s'%(controller_image.image.name,controller_image.controller.name), # name of ansible playbook
			}

	res = run_template('sync_controller_images.yaml', image_fields, path='controller_images')

	if (len(res)!=1):
	    raise Exception('Could not sync image %s'%controller_image.image.name)
	else:
	    image_id = res[0]['id'] 
            controller_image.glance_image_id = image_id
            controller_image.save()
