def heartbeat_check(): ''' Find the node with the oldest hearbeat timestamp and query it ''' logging.debug('DEBUG: heartbeat_check()') siblings = Sibling.objects.filter().order_by('last_heartbeat') if siblings: oldest = siblings[0] try: lock = Lock.acquire_lock(u''.join(['heartbeat_check', oldest.uuid]), 20) node = RemoteCall(uuid=oldest.uuid) oldest.last_heartbeat = datetime.datetime.now() response = node.heartbeat() oldest.cpuload = int(float(response['cpuload'])) oldest.status = NODE_STATUS_UP oldest.failure_count = 0 oldest.save() lock.release() except LockError: pass except HeartbeatError: oldest.status = NODE_STATUS_DOWN oldest.failure_count += 1 oldest.save() if oldest.failure_count > HEARTBEAT_FAILURE_THRESHOLD: oldest.delete() lock.release()
def join(request): if request.method == 'POST': form = JoinForm(request.POST) if form.is_valid(): try: entry_point = RemoteCall( ip_address=form.cleaned_data['ip_address'], port=form.cleaned_data['port'] ) entry_point.announce() messages.success(request, _(u'Join request sent')) return HttpResponseRedirect(reverse('home_view')) except AnnounceClientError: messages.error(request, _(u'Unable to join network')) return HttpResponseRedirect(reverse('join')) else: form = JoinForm() return render_to_response('generic_form.html', { 'form': form, 'title': _(u'Join the OpenRelay network via a remote node'), }, context_instance=RequestContext(request))
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()