Beispiel #1
0
    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()
Beispiel #2
0
 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)
Beispiel #3
0
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
Beispiel #4
0
 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)
Beispiel #5
0
 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)
Beispiel #6
0
 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)
Beispiel #7
0
 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)
Beispiel #8
0
 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))
Beispiel #12
0
 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)