def keepalive(self, request): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) try: ServerNode.record_heartbeat(**serializer.data) except ServerNode.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) return Response()
def test_server_assignemnt_pref_server_dont_exclude_for_other_groups_if_preferred( self): serv_local = self._make_server(last_heartbeat=now() - timedelta(seconds=100)) serv_other_region_pref = self._make_server(last_heartbeat=now() - timedelta(seconds=100), region='other') g1 = mommy.make('kl_participants.Group', region=self.region) g2 = mommy.make('kl_participants.Group', region='other') PreferredServer.objects.create(group=g1, server=serv_other_region_pref, priority=1) self.assertEquals(ServerNode.assign_server(g1), serv_other_region_pref) self.assertEquals(ServerNode.assign_server(g2), serv_other_region_pref)
def start_lesson(group, moderator): """""" room = get_group_active_meeting(group) # group does not have running meeting, create one if not room: server = ServerNode.assign_server(group=group) room, _ = Room.objects.get_or_create(server_node=server, group=group) server = room.server_node api = BigBlueButtonAPI(server.hostname, server.api_secret) try: bbb_room = api.create_room( meeting_id=room.bbb_meeting_id, attendee_secret=User.objects.make_random_password(), moderator_secret=User.objects.make_random_password(), ) room.attendee_secret = bbb_room.attendeePW room.moderator_secret = bbb_room.moderatorPW room.save() except RoomAlreadyExistsError: pass # Connect to room redirect_url = api.get_join_url( meeting_id=room.bbb_meeting_id, password=room.moderator_secret, join_as=moderator.display_name, assing_user_id=moderator.uuid, ) return redirect_url
def test_server_assignemnt_same_region_pref(self): serv_local = self._make_server(last_heartbeat=now() - timedelta(seconds=100)) serv_other = self._make_server(last_heartbeat=now() - timedelta(seconds=100), region='other') g = mommy.make('kl_participants.Group', region=self.region) self.assertEquals(ServerNode.assign_server(g), serv_local)
def test_server_assignemnt_pref_server_precedence(self): serv_local = self._make_server(last_heartbeat=now() - timedelta(seconds=100)) serv_other_region_pref = self._make_server(last_heartbeat=now() - timedelta(seconds=100), region='other') g = mommy.make('kl_participants.Group', region=self.region) PreferredServer.objects.create(group=g, server=serv_other_region_pref, priority=1) self.assertEquals(ServerNode.assign_server(g), serv_other_region_pref)
def test_server_assignemnt_same_region_pref_respects_high_load(self): serv_other = self._make_server(display_name='dupa2', last_heartbeat=now() - timedelta(seconds=100), region='other', load_5m=1) serv_local = self._make_server(display_name='dupa', last_heartbeat=now() - timedelta(seconds=100), load_5m=1.90) g = mommy.make('kl_participants.Group', region=self.region) self.assertEquals(ServerNode.assign_server(g), serv_other)
def test_server_assignemnt_pref_server_precedence_multiple_by_assignment_id( self): serv_assigned_last = self._make_server(last_heartbeat=now() - timedelta(seconds=100)) serv_assigned_first = self._make_server(last_heartbeat=now() - timedelta(seconds=100)) g = mommy.make('kl_participants.Group', region=self.region) PreferredServer.objects.create(group=g, server=serv_assigned_first, priority=2) PreferredServer.objects.create(group=g, server=serv_assigned_last, priority=1) self.assertEquals(ServerNode.assign_server(g), serv_assigned_first)
def test_server_assignemnt_pref_server_precedence_respects_high_load(self): serv_other = self._make_server(display_name='dupa2', last_heartbeat=now() - timedelta(seconds=100), region='other', load_5m=1) serv_pref_high_load = self._make_server(display_name='dupa', last_heartbeat=now() - timedelta(seconds=100), load_5m=1.90) g = mommy.make('kl_participants.Group', region=self.region) PreferredServer.objects.create(group=g, server=serv_pref_high_load, priority=1) self.assertEquals(ServerNode.assign_server(g), serv_other)
def _get_or_create_room(group): """"Returns active room for a group or assigns new one.""" room = group.last_meeting_room() # Room already exists, got to probe it if room: server = room.server_node api = BigBlueButtonAPI(server.hostname, server.api_secret) if api.is_meeting_running(room.bbb_meeting_id): logger.info(f'Meeting for group {group} already in progress.') return room else: # Room leftover, clean it from BBB and let assign new logger.info(f'Cleaning leftover room for group {group}') Room.objects.filter(id=room.id).delete() room = None # Room not found or not active, assign new from refreshed pool if not room: server = ServerNode.assign_server(group=group) room, _ = Room.objects.get_or_create(server_node=server, group=group) return room
def test_excludes_dead_servers(self): serv1 = self._make_server(last_heartbeat=now() - timedelta(seconds=301)) g = mommy.make('kl_participants.Group', region=self.region) self.assertIsNone(ServerNode.assign_server(g))
def test_server_assignment_no_servers(self): g = mommy.make('kl_participants.Group') self.assertIsNone(ServerNode.assign_server(g))
def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) node = ServerNode.register_server_node(**serializer.data) return Response(status=status.HTTP_200_OK if node is not None else status.HTTP_304_NOT_MODIFIED)