Exemple #1
0
 def test_success(self):
     prepare = Prepare(id=3, key='biz', predicate='set', argument='a')
     success = Success(prepare=prepare)
     self.assertEqual(success.to_json(), {
         'status': 'SUCCESS',
         'prepare': prepare.to_json()
     })
Exemple #2
0
 def getNextGameId(self):
     """
         Input:
         Output: Success[Int] or Failure
     """
     maybeMaxGameId = self.database.getMaxGameId()
     if (maybeMaxGameId.isFailure()):
         return maybeMaxGameId
     else:
         maxGameId = maybeMaxGameId.get()
         if (maxGameId == []):
             return Success(1)
         else:
             return Success(maxGameId + 1)
 def writeQuery(self, queryString, parameters):
     try:
         self.cursor.execute(queryString, parameters)
         return Success("Write Query Successful")
     except:
         print("Error executing write query")
         return Failure("Error executing write query")
Exemple #4
0
 def removeFriend(self,username,friend):
     """
         Input: username: String, friend: String
         Output: Success[String] or Failure
     """
     isRealPlayers = self.playersExist([username,friend])
     if (not isRealPlayers):
         return Failure("User does not exist!")
     else:
         userOneFriends = self.getFriendsForUser(username)
         userTwoFriends  = self.getFriendsForUser(friend)
         if (userOneFriends.isFailure()):
             return userOneFriends
         if (userTwoFriends.isFailure()):
             return userTwoFriendsCsv
         else:
             userOneFriendsList = csvToList(userOneFriends.getOrElse([]))
             userTwoFriendsList = csvToList(userTwoFriends.getOrElse([]))
             if (friend not in userOneFriendsList):
                 return Failure("User is not friends with this other user")
             elif (username not in userTwoFriendsList):
                 return Failure("Friend is not friends with this user")
             else:
                 userOneFriendsList.remove(friend)
                 userTwoFriendsList.remove(username)
                 resultOne = self.database.updateFriendList(username,listToCsvString(userOneFriendsList))
                 resultTwo = self.database.updateFriendList(friend,listToCsvString(userTwoFriendsList))
                 if (resultOne.isFailure()):
                     return resultOne
                 elif (resultTwo.isFailure()):
                     return resultTwo
                 else:
                     return Success("Friend Removed")
Exemple #5
0
 def post(self):
     learn = Learn.from_request(self.request)
     logger.info("Adding new learn, %s, to completed rounds.",
                 learn.to_json())
     completed_rounds.add(learn)
     ordered_rounds.append(learn)
     success = Success(prepare=learn.prepare)
     self.respond(code=200, message=success)
 def getQuery(self, queryString, parameters):
     try:
         self.cursor.execute(queryString, parameters)
     except:
         print("Error executing get query")
         return Failure("Error executing get query")
     rows = self.cursor.fetchall()
     result = Success(rows)
     return result
Exemple #7
0
 def test_learner_learns(self):
     learn = Learn(prepare=self.get_prepare())
     response = self.post('/learn', learn.to_json())
     self.assertEqual(response.code, 200)
     self.assertEqual(
         Success.from_response(response).to_json(), {
             'status': 'SUCCESS',
             'prepare': self.get_prepare().to_json()
         })
     self.assertEqual(
         agent.completed_rounds.highest_numbered().prepare.to_json(),
         self.get_prepare().to_json())
Exemple #8
0
 def getGameFromGameId(self,gameId):
     """
         Input: gameId: String
         Output: Success[Game] or Failure
     """
     if (self.database.gameIdExists(gameId).getOrElse([(0,)])[0][0] != 1):
         return Failure("Game Id doesn't exist")
     else:
         gameRowResult = self.database.getByGameId(gameId)
         if (gameRowResult.isFailure()):
             return Failure("Failed to get game from the database")
         else:
             gameData = gameRowResult.get()[0][0]
             decodedGame = self.jsonDecoder.decode(gameData)
             return Success(decodedGame)
Exemple #9
0
 def acceptFriendRequest(self,username,otherUsername):
     """
         Input: username: String, otherUsername: String
         Output: Success[String] or Failure
     """
     isRealPlayers = self.playersExist([username,otherUsername])
     if (isRealPlayers):
         return Failure("User does not exist!")
     else:
         userOneRequests = self.getFriendRequestsForUser(username)
         userOneFriends  = self.getFriendsForUser(username)
         userTwoFriends  = self.getFriendsForUser(otherUsername)
         if (userOneRequests.isFailure()):
             return userOneRequests
         elif (userOneFriends.isFailure()):
             return userOneFriends
         elif (userTwoFriends.isFailure()):
             return userTwoFriends
         else:
             newUserOneRequests = userOneRequests.getOrElse([])
             newUserOneFriends  = userOneFriends.getOrElse([])
             newUserTwoFriends  = userTwoFriends.getOrElse([])
             if (otherUsername not in newUserOneRequests):
                 return Failure("Other user is not in users requests")
             elif (otherUsername in newUserOneFriends or username in newUserTwoFriends):
                 return Failure("Users are already friends")
             else:
                 newUserOneRequests.remove(otherUsername)
                 newUserOneFriends.append(otherUsername)
                 newUserTwoFriends.append(username)
                 resultOne   = self.database.updateFriendRequestList(username,listToCsvString(newUserOneRequests))
                 resultTwo   = self.database.updateFriendList(username,listToCsvString(newUserOneFriends))
                 resultThree = self.database.updateFriendList(otherUsername,listToCsvString(newUserTwoFriends))
                 if (resultOne.isFailure()):
                     return resultOne
                 elif (resultTwo.isFailure()):
                     return resultTwo
                 elif (resultThree.isFailure()):
                     return resultThree
                 else:
                     return Success("Friend Request Accepted")
Exemple #10
0
    def createGame(self,gameName,players):
        """
            Input: gameName: String, players: List[String]
            Output: Success[Game] or Failure
        """
        gameId = self.getNextGameId()
        if (not self.playersExist(players)):
            return Failure("User does not exist")
        elif (gameName == "ChessGame"):
            game = ChessGame(str(gameId),players)
            playerOneIds = self.database.getGameIdsForUser(players[0]).get()[0][0]
            newPlayerOneIds = listToCsvString(playerOneIds.split(",").append(gameId))

            playerTwoIds = self.database.getGameIdsForUser(players[1]).get()[0][0]
            newPlayerTwoIds = listToCsvString(playerTwoIds.split(",").append(gameId))

            updateOne = self.database.updateGameIdsForUser(newPlayerOneIds,players[0])
            updateTwo = self.database.updateGameIdsForUser(newPlayerTwoIds,players[1])
            if (updateOne.isSuccess() and updateTwo.isSuccess()):
                return Success(game)
            else:
                Failure("Failed to update game ids for a user")
        else:
            return Failure("Generic Failure")
Exemple #11
0
 def changeUsersPassword(self,username,oldPassword,newPassword):
     playerExists = self.database.userExists(username)
     if (playerExists.getOrElse(0) != 1):
         return Failure("User does not exist!")
     else:
         if (username == "uni"):
             return Failure("Cannot update password")
         else:
             maybePasswordHash = self.database.getUsersPassword(username)
             if (maybePasswordHash.isFailure()):
                 return Failure("Failed to get users old password")
             else:
                 if (encryption_context.verify(oldPassword,maybePasswordHash.getOrElse(""))):
                     result = self.database.changePassword(username,self.encryptString(newPassword))
                     if (result.isFailure()):
                         logResultOne = self.database.enterLogMessage("Update password Query error for user: '******'")
                         if (logResultOne.isFailure()):
                             print(logResultOne.getErrorMessage())
                         return result
                     else:
                         logResultTwo = self.database.enterLogMessage("'" + username + "' changed their password")
                         if (logResultTwo.isFailure()):
                             print(logResultTwo.getErrorMessage())
                         return Success("Password Changed Successfully")
Exemple #12
0
def save_result(result):
    if result:
        session = Session()
        new_success = Success(**result)
        session.add(new_success)
        session.commit()
Exemple #13
0
    def post(self):
        """
        {
            key: <str>,
            predicate: <str>,
            argument: <str|int>
        }
        """
        request = json.loads(self.request.body)
        prepare = Prepare(**request)
        prepares = collections.deque([prepare])
        current_promises.add(Promise(prepare=prepare))
        quorum = agents.quorum(excluding=options.port)
        while prepares:  # TODO: Timeout here.
            prepare = prepares.popleft()
            logging.info("Sending prepare for %s", prepare)
            responses, issued, conflicting = yield prepare.send(quorum)
            logger.info("Got %s issued and %s conflicting", len(issued),
                        len(conflicting))
            logger.info("Response codes: %s",
                        ", ".join([str(r.code) for r in responses]))
            if conflicting:  # Issue another promise.
                logger.warning(
                    "%s was pre-empted by a higher ballot. retrying.".format(
                        prepare.id))
                prepares.append(
                    Prepare(key=prepare.key,
                            predicate=prepare.predicate,
                            argument=prepare.argument))
                continue
            elif len(issued) != len(quorum):
                raise tornado.web.HTTPError(
                    status_code=500,
                    log_message='FAILED to acquire quorum on Promise')
            promises = Promises.from_responses(responses)
            earlier_promise = promises.highest_numbered()
            if earlier_promise and earlier_promise not in current_promises:  # Repair.
                prepares.append(prepare)
                prepare = earlier_promise.prepare

            # Now we have a promise.
            responses, issued, conflicting = yield Propose(
                prepare=prepare).send(quorum)
            if len(issued) == len(quorum):
                logger.info("Got success for propose %s. Learning...", prepare)
                successes = yield Learn(prepare).fanout(expected=Success)
            elif conflicting:
                logger.error("Conflicting promise detected. Will re-issue.")
                raise Exception("Conflicting promise detected.")
            else:
                raise tornado.web.HTTPError(
                    status_code=500,
                    log_message='Failed to acquire quorum on Accept')

        if len(successes) == len(agents.all()):
            current_promises.remove(prepare)
            self.respond(Success(prepare))
        else:
            logger.error("Got %s successes with a required quorum of %s",
                         len(successes), len(agents.all()))
            raise tornado.web.HTTPError(
                status_code=500,
                log_message='Failed to acquire quorum on Learn')