JeffDeCola/jeffCoin

View on GitHub
routingnode/routingnode-interface.go

Summary

Maintainability
B
4 hrs
Test Coverage
// jeffCoin 3. ROUTINGNODE routingnode-interface.go

package routingnode

import (
    "bufio"
    "encoding/json"
    "errors"
    "fmt"
    "net"
    "time"

    log "github.com/sirupsen/logrus"
)

// NODELIST **************************************************************************************************************

// GetNodeList -  Gets the nodeList
func GetNodeList() nodeSlice {

    s := "START  GetNodeList() -  Gets the nodeList"
    log.Debug("ROUTINGNODE: I/F      " + s)

    theNodeList := getNodeList()

    s = "END    GetNodeList() -  Gets the nodeList"
    log.Debug("ROUTINGNODE: I/F      " + s)

    return theNodeList

}

// GenesisNodeList - Creates the nodeList
func GenesisNodeList() {

    s := "START  GenesisNodeList() - Creates the nodeList"
    log.Debug("ROUTINGNODE: I/F      " + s)

    thisNode := appendThisNode()

    s = "Congrats, your first Node is in your nodeList (-loglevel trace to display)"
    log.Info("ROUTINGNODE: I/F             " + s)
    js, _ := json.MarshalIndent(thisNode, "", "    ")
    log.Trace("\n\n" + string(js) + "\n\n")

    s = "END    GenesisNodeList() - Creates the nodeList"
    log.Debug("ROUTINGNODE: I/F      " + s)

}

// RequestNodeList -  Requests the nodeList from a Network Node
func RequestNodeList(networkIP string, networkTCPPort string) error {

    s := "START  RequestNodeList() -  Requests the nodeList from a Network Node"
    log.Debug("ROUTINGNODE: I/F      " + s)

    // CONN - SETUP THE CONNECTION
    s = "----------------------------------------------------------------"
    log.Info("ROUTINGNODE: I/F             " + s)
    s = "CLIENT - Requesting a connection"
    log.Info("ROUTINGNODE: I/F             " + s)
    s = "----------------------------------------------------------------"
    log.Info("ROUTINGNODE: I/F             " + s)
    s = "-C conn   TCP Connection on " + networkIP + ":" + networkTCPPort
    log.Info("ROUTINGNODE: I/F   " + s)
    conn, err := net.Dial("tcp", networkIP+":"+networkTCPPort)
    checkErr(err)

    // RCV - GET THE RESPONSE MESSAGE (Waiting for Command)
    message, _ := bufio.NewReader(conn).ReadString('\n')
    s = "-C rcv    Message from Network Node: " + message
    log.Info("ROUTINGNODE: I/F   " + s)
    if message == "ERROR" {
        s = "ERROR: Waiting for Command"
        log.Debug("ROUTINGNODE: I/F              " + s)
        return errors.New(s)
    }

    // REQ - SEND-NODELIST
    s = "-C req    - SEND-NODELIST"
    log.Info("ROUTINGNODE: I/F   " + s)
    fmt.Fprintf(conn, "SEND-NODELIST\n")

    // RCV - GET THE nodeList
    messageNodeList, _ := bufio.NewReader(conn).ReadString('\n')
    s = "-C rcv    Message from Network Node: " + messageNodeList
    log.Info("ROUTINGNODE: I/F   " + s)
    if messageNodeList == "ERROR" {
        s = "ERROR: Could not get nodeList from node"
        log.Error("ROUTINGNODE: I/F              " + s)
        return errors.New(s)
    }

    // LOAD THE nodeList
    loadNodeList(messageNodeList)

    // SEND - THANK YOU
    s = "-C send   - Thank you"
    log.Info("ROUTINGNODE: I/F   " + s)
    fmt.Fprintf(conn, "Thank You\n")

    // RCV - GET THE RESPONSE MESSAGE (Waiting for Command)
    message, _ = bufio.NewReader(conn).ReadString('\n')
    s = "-C rcv    Message from Network Node: " + message
    log.Info("ROUTINGNODE: I/F   " + s)
    if message == "ERROR" {
        s = "ERROR: Waiting for Command"
        log.Debug("ROUTINGNODE: I/F              " + s)
        return errors.New(s)
    }

    // REQ - EOF (CLOSE CONNECTION)
    s = "-C req    - EOF (CLOSE CONNECTION)"
    log.Info("ROUTINGNODE: I/F   " + s)
    fmt.Fprintf(conn, "EOF\n")
    time.Sleep(2 * time.Second)
    conn.Close()
    s = "----------------------------------------------------------------"
    log.Info("ROUTINGNODE: I/F             " + s)
    s = "CLIENT - Closed a connection"
    log.Info("ROUTINGNODE: I/F             " + s)
    s = "----------------------------------------------------------------"
    log.Info("ROUTINGNODE: I/F             " + s)

    s = "END    RequestNodeList() -  Requests the nodeList from a Network Node"
    log.Debug("ROUTINGNODE: I/F      " + s)

    return nil

}

// NODE ******************************************************************************************************************

// GetNode - Gets a Node (via Index number) from the nodeList
func GetNode(id string) NodeStruct {

    s := "START  GetNode() - Gets a Node (via Index number) from the nodeList"
    log.Debug("ROUTINGNODE: I/F      " + s)

    theNode := getNode(id)

    // RETURN NOT FOUND
    s = "END    GetNode() - Gets a Node (via Index number) from the nodeList"
    log.Debug("ROUTINGNODE: I/F      " + s)

    return theNode

}

// AppendNewNode - Appends a new Node to the nodeList
func AppendNewNode(messageNewNode string) NodeStruct {

    s := "START  AppendNewNode() - Appends a new Node to the nodeList"
    log.Debug("ROUTINGNODE: I/F      " + s)

    newNode := appendNewNode(messageNewNode)

    s = "END    AppendNewNode() - Appends a new Node to the nodeList"
    log.Debug("ROUTINGNODE: I/F      " + s)

    return newNode

}

// THISNODE **************************************************************************************************************

// GetThisNode - Gets thisNode
func GetThisNode() NodeStruct {

    s := "START  GetThisNode() - Gets thisNode"
    log.Debug("ROUTINGNODE: I/F      " + s)

    theNode := getThisNode()

    s = "END    GetThisNode() - Gets thisNode"
    log.Debug("ROUTINGNODE: I/F      " + s)

    return theNode
}

// LoadThisNode - Loads thisNode
func (n NodeStruct) LoadThisNode() {

    s := "START  LoadThisNode() - Loads thisNode"
    log.Debug("ROUTINGNODE: I/F      " + s)

    n.loadThisNode()

    s = "Congrats, you loaded thisNode (-loglevel trace to display)"
    log.Info("ROUTINGNODE: I/F             " + s)
    js, _ := json.MarshalIndent(thisNode, "", "    ")
    log.Trace("\n\n" + string(js) + "\n\n")

    s = "END    LoadThisNode() - Loads thisNode"
    log.Debug("ROUTINGNODE: I/F      " + s)

}

// AppendThisNode - Appends thisNode to the nodeList
func AppendThisNode() {

    s := "START  AppendThisNode() - Appends thisNode to the nodeList"
    log.Debug("ROUTINGNODE: I/F      " + s)

    // DO YOU ALREADY HAVE thisNode IN THE nodeList?
    if !checkIfThisNodeinNodeList() {

        _ = appendThisNode()

    }

    s = "END    AppendThisNode() - Appends thisNode to the nodeList"
    log.Debug("ROUTINGNODE: I/F      " + s)

}

// BroadcastThisNode - Broadcasts thisNode to the Network
func BroadcastThisNode() error {

    s := "START  BroadcastThisNode() - Broadcasts thisNode to the Network"
    log.Debug("ROUTINGNODE: I/F      " + s)

    // DO YOU ALREADY HAVE thisNode IN THE nodeList?
    if checkIfThisNodeinNodeList() {

        s = "YOU ALREADY HAVE thisNode IN THE nodeList"
        log.Info("ROUTINGNODE: I/F             " + s)

        s = "END    BroadcastThisNode() - Broadcasts thisNode to the Network"
        log.Debug("ROUTINGNODE: I/F      " + s)

        return nil

    }

    s = "thisNode IN NOT THE nodeList"
    log.Info("ROUTINGNODE: I/F             " + s)

    theNodeList := getNodeList()

    // FOR EACH NODE IN NODELIST
    for _, item := range theNodeList {

        networkIP := item.NodeIP
        networkTCPPort := item.NodeTCPPort

        //  CONN - SETUP THE CONNECTION
        s = "----------------------------------------------------------------"
        log.Info("ROUTINGNODE: I/F             " + s)
        s = "CLIENT - Requesting a connection"
        log.Info("ROUTINGNODE: I/F             " + s)
        s = "----------------------------------------------------------------"
        log.Info("ROUTINGNODE: I/F             " + s)
        s = "-C conn   TCP Connection on " + networkIP + ":" + networkTCPPort
        log.Info("ROUTINGNODE: I/F   " + s)
        conn, err := net.Dial("tcp", networkIP+":"+networkTCPPort)
        if err != nil {
            // The connection is down - Skip this node
            s := "ERROR - NODE DOWN (SKIP) " + networkIP + ":" + networkTCPPort
            log.Warn("ROUTINGNODE: I/F              " + s)
            continue
        }

        // RCV - GET THE RESPONSE MESSAGE (Waiting for command)
        message, _ := bufio.NewReader(conn).ReadString('\n')
        s = "-C rcv    Message from Network Node: " + message
        log.Info("ROUTINGNODE: I/F   " + s)
        if message == "ERROR" {
            s = "ERROR: Waiting for command"
            log.Error("ROUTINGNODE: I/F              " + s)
            return errors.New(s)
        }

        // REQ - BROADCAST-ADD-NEW-NODE
        s = "-C req    - BROADCAST-ADD-NEW-NODE"
        log.Info("ROUTINGNODE: I/F   " + s)
        fmt.Fprintf(conn, "BROADCAST-ADD-NEW-NODE\n")

        // RCV - GET THE RESPONSE MESSAGE (ASKING TO SEND thisNode)
        message, _ = bufio.NewReader(conn).ReadString('\n')
        s = "-C rcv    Message from Network Node: " + message
        log.Info("ROUTINGNODE: I/F   " + s)
        if message == "ERROR" {
            s = "ERROR: ASKING TO SEND thisNode"
            log.Error("ROUTINGNODE: I/F              " + s)
            return errors.New(s)
        }

        // SEND - SEND thisNode
        s = "-C send   SEND thisNode"
        log.Info("ROUTINGNODE: I/F   " + s)
        thisNode := getThisNode()
        js, _ := json.Marshal(thisNode)
        s = string(js)
        fmt.Fprintf(conn, s+"\n")

        // RCV - GET THE RESPONSE MESSAGE (AppendedNode to the Nodelist)
        message, _ = bufio.NewReader(conn).ReadString('\n')
        s = "-C rcv    Message from Network Node: " + message
        log.Info("ROUTINGNODE: I/F   " + s)
        if message == "ERROR" {
            s = "ERROR: AppendedNode to the Nodelist"
            log.Debug("ROUTINGNODE: I/F              " + s)
            return errors.New(s)
        }

        // SEND - THANK YOU
        s = "-C send   - Thank you"
        log.Info("ROUTINGNODE: I/F   " + s)
        fmt.Fprintf(conn, "Thank You\n")

        // RCV - GET THE RESPONSE MESSAGE (Waiting for Command)
        message, _ = bufio.NewReader(conn).ReadString('\n')
        s = "-C rcv    Message from Network Node: " + message
        log.Info("ROUTINGNODE: I/F   " + s)
        if message == "ERROR" {
            s = "ERROR: Waiting for Command"
            log.Debug("ROUTINGNODE: I/F              " + s)
            return errors.New(s)
        }

        // REQ - EOF (CLOSE CONNECTION)
        s = "-C req    - EOF (CLOSE CONNECTION)"
        log.Info("ROUTINGNODE: I/F   " + s)
        fmt.Fprintf(conn, "EOF\n")
        time.Sleep(2 * time.Second)
        conn.Close()
        s = "----------------------------------------------------------------"
        log.Info("ROUTINGNODE: I/F             " + s)
        s = "CLIENT - Closed a connection"
        log.Info("ROUTINGNODE: I/F             " + s)
        s = "----------------------------------------------------------------"
        log.Info("ROUTINGNODE: I/F             " + s)

    }

    s = "END    BroadcastThisNode() - Broadcasts thisNode to the Network"
    log.Debug("ROUTINGNODE: I/F      " + s)

    return nil

}