Ejemplo n.º 1
0
def inventory_hash_check():
    '''
    Find the node with the oldest inventory timestamp and query it
    '''
    logging.debug('DEBUG: inventory_hash_check()')
    siblings = Sibling.objects.filter(status=NODE_STATUS_UP).order_by('last_inventory_hash')
    if siblings:
        oldest = siblings[0]
        try:
            lock = Lock.acquire_lock(u''.join(['inventory_hash', oldest.uuid]), 20)
            oldest.last_inventory_hash = datetime.datetime.now()
            remote_api = RemoteCall(uuid=oldest.uuid)
            response = remote_api.inventory_hash()
            if oldest.inventory_hash != response['inventory_hash']:
                # Delete this holder from all it's resources to catch
                # later the ones it doesn't have anymore
                ResourceHolder.objects.filter(node__uuid=oldest.uuid).delete()
                for resource_item in remote_api.resource_list():
                    uuid, timestamp=resource_item['uuid'].split(TIMESTAMP_SEPARATOR)
                    resource, created = NetworkResourceVersion.objects.get_or_create(
                        uuid=uuid,
                        timestamp=timestamp,
                        defaults={
                            'metadata': dumps(resource_item.get('metadata')),
                            'signature_properties': dumps(resource_item.get('signature_properties')),
                        }
                    )
                    resource.resourceholder_set.get_or_create(node=oldest)
                
            oldest.inventory_hash = response['inventory_hash']
            oldest.save()
            # Delete network resources that have no holder
            NetworkResourceVersion.objects.filter(resourceholder=None).delete()
            lock.release()
        except LockError:
            pass
        except InventoryHashError:
            lock.release()