Exemplo n.º 1
0
    def unregister(self, client):
        """
        Unregister `client` if it exists.

        Args:
            client (CloudNodeProtocol): Client to be unregistered.
        
        Returns:
            bool: Returns whether unregistration was successful.
        """
        messages = []

        success = False
        for repo_id, repo_clients in self.clients.items():
            state.start_state(repo_id)
            for client_type, clients in repo_clients.items():
                if client in clients:
                    print("Unregistered client {}".format(client.peer))
                    self.clients[repo_id][client_type].remove(client)
                    success = True
                    if client_type == ClientType.DASHBOARD:
                        state.reset_state(repo_id)
                    elif state.state["busy"]:
                        state.state["num_nodes_chosen"] -= 1
                        if state.state["num_nodes_chosen"] == 0:
                            state.reset_state(repo_id)
                            message = self._make_no_nodes_left_message(repo_id)
                            messages.append(message)

            state.stop_state()
        return success, messages
Exemplo n.º 2
0
def serve_tfjs_model(session_id, filename):
    """
    Serves the TFJS model to the user.

    TODO: Should do this through ngnix for a boost in performance. Should also
    have some auth token -> session id mapping (security fix in the future).

    Args:
        filename (str): The filename to serve.
    """
    if not state.start_state_by_session_id(session_id):
        return "No active session!\n"
    try:
        if not state.state["busy"]:
            return "No active session!\n"
        if state.state["library_type"] != LibraryType.JS.value:
            return "Current session is not for JAVASCRIPT!"
        folder_path = os.path.join(app.root_path,
                                   state.state['tfjs_model_path'])
    except Exception as e:
        print("Exception getting TFJS model: " + str(e))
        state.stop_state()
        return
    state.stop_state()
    return send_from_directory(folder_path, filename)
Exemplo n.º 3
0
    def onMessage(self, payload, isBinary):
        """
        Processes the payload received by a connected node.

        Messages are ignored unless the message is of type "REGISTER" or the
        node has already been registered (by sending a "REGISTER" type message).

        """
        print("Got payload!")
        if isBinary:
            print("Binary message not supported.")
            return

        try:
            received_message = validate_new_message(payload)
        except Exception as e:
            if isinstance(e, json.decoder.JSONDecodeError):
                error_message = "Error while converting JSON."
            else:
                error_message = "Error deserializing message: {}"
                error_message = error_message.format(e)
            message = {
                "error": True,
                "error_message": error_message,
                "type": ErrorType.DESERIALIZATION.value
            }
            self.sendMessage(json.dumps(message).encode(), isBinary)
            print(error_message)
            return

        # Process message
        try:
            state.start_state(received_message.repo_id)
            results = process_new_message(received_message, self.factory, self)
            state.stop_state()
        except Exception as e:
            state.stop_state()
            error_message = "Error processing new message: " + str(e)
            print(error_message)
            raise e
            results = make_error_results(error_message, ErrorType.OTHER)

        print(results)

        if results["action"] == ActionType.BROADCAST:
            self._broadcastMessage(
                payload=results["message"],
                client_list=results["client_list"],
                isBinary=isBinary,
            )
        elif results["action"] == ActionType.UNICAST:
            message = json.dumps(results["message"]).encode()
            self.sendMessage(message, isBinary)
Exemplo n.º 4
0
def reset_state(repo_id):
    """
    Resets the state of the cloud node.
    """
    state.start_state(repo_id)
    try:
        state.reset_state(repo_id)
    except Exception as e:
        print("Exception resetting state: " + str(e))
        state.stop_state()
        return
    state.stop_state()
    return "State reset successfully!"
Exemplo n.º 5
0
def get_state(repo_id):
    """
    Get the state of the cloud node.
    """
    state.start_state(repo_id)
    try:
        state_dict = repr(state.state)
    except Exception as e:
        print("Exception getting state: " + str(e))
        state.stop_state()
        return

    state.stop_state()
    return state_dict
Exemplo n.º 6
0
def get_status(repo_id):
    """
    Returns the status of the Cloud Node.

    The dashboard-api is the only hitting this endpoint, so it should be
    secured.
    """
    state.start_state(repo_id)
    try:
        status = jsonify({"Busy": state.state["busy"]})
    except Exception as e:
        print("Exception getting status: " + str(e))
        state.stop_state()
        return
    state.stop_state()
    return status
Exemplo n.º 7
0
def serve_keras_model(session_id):
    if not state.start_state_by_session_id(session_id):
        return "No active session!\n"
    try:
        if not state.state["busy"]:
            return "No active session!\n"
        if state.state["library_type"] != LibraryType.PYTHON.value:
            return "Current session is not for PYTHON!"
        app_path = os.path.join(app.root_path, state.state['h5_model_path'])
    except Exception as e:
        print("Exception getting Keras model: " + str(e))
        state.stop_state()
        return

    state.stop_state()
    return send_file(app_path)
Exemplo n.º 8
0
def serve_mlmodel(session_id):
    """
    Serves the mlmodel model to the user.

    TODO: Should do this through ngnix for a boost in performance. Should also
    have some auth token -> session id mapping (security fix in the future).
    """
    if not state.start_state_by_session_id(session_id):
        return "No active session!\n"
    try:
        if not state.state["busy"]:
            return "No active session!\n"
        if state.state["library_type"] != LibraryType.IOS_IMAGE.value:
            return "Current session is not for IOS!"
        app_path = os.path.join(app.root_path, state.state['mlmodel_path'])
    except Exception as e:
        print("Exception getting mlmodel: " + str(e))
        state.stop_state()
        return
    state.stop_state()
    return send_file(app_path)
Exemplo n.º 9
0
def reset_state(repo_id, api_key):
    state.start_state(repo_id)
    state.state["test"] = True
    yield
    state.reset_state(repo_id)
    state.stop_state()