diff --git a/local/client/client.go b/local/client/client.go index 61ec8ef1be4a1aacdd44762020986c15c57609ca..52ed843c6c0baa71ea4d51b0e8bfb3399781d0a6 100644 --- a/local/client/client.go +++ b/local/client/client.go @@ -3,7 +3,7 @@ package main import ( "encoding/json" "fmt" - types "local/types" + types "local/helper" "net" "os" "strconv" diff --git a/local/helper/azure_handler.go b/local/helper/azure_handler.go new file mode 100644 index 0000000000000000000000000000000000000000..e579c6bfe88bf98aae4dd414766093c08d27bc80 --- /dev/null +++ b/local/helper/azure_handler.go @@ -0,0 +1,88 @@ +package helper + +import ( + "context" + "encoding/json" + "fmt" + "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" + dotenv "github.com/joho/godotenv" + "io" + "os" +) + +var client *azblob.Client +var err error +var ctx context.Context + +// test program for the object storage module +func main() { + err := dotenv.Load() //load .env file + if err != nil { + panic(err) + } + var connectionString = os.Getenv("AZ_STORAGE_CONNECTION_STRING") + var containerName = "" + + ConnectToStorage(connectionString) + ListBlobsOnContainer(containerName, nil) + + data := ReadFromStorage(containerName, "test.json") + var transactions []Transaction + err = json.Unmarshal(data, &transactions) + if err != nil { + panic(err) + } + fmt.Printf("%s\n", transactions) +} + +func ConnectToStorage(connectionString string) { + client, err = azblob.NewClientFromConnectionString(connectionString, nil) + if err != nil { + panic(err) + } + ctx = context.Background() +} + +func ListBlobsOnContainer(containerName string, options *azblob.ListBlobsFlatOptions) { + fmt.Printf("Listing blobs on container [%s] ...\n", containerName) + pager := client.NewListBlobsFlatPager(containerName, options) + for pager.More() { + resp, err := pager.NextPage(ctx) + if err != nil { + panic(err) + } + for _, _blob := range resp.Segment.BlobItems { + fmt.Printf("%s\n", *_blob.Name) + } + } +} + +func ReadFromStorage(containerName string, blobName string) []byte { + resp, err := client.DownloadStream(ctx, containerName, blobName, nil) + if err != nil { + panic(err) + } + blobData, err := io.ReadAll(resp.Body) + if err != nil { + panic(err) + } + return blobData +} + +func WriteToStorage() { + //TODO: Implements + +} + +/* +jsonString must be formatted like that : +[{},{},{}] with each object inside the array having the properties as named on the Transaction type of the types.go file +*/ +func JsonDataToTransactions(jsonString []byte) []Transaction { + var transactions []Transaction + err = json.Unmarshal(jsonString, &transactions) + if err != nil { + panic(err) + } + return transactions +} diff --git a/local/types/types.go b/local/helper/types.go similarity index 98% rename from local/types/types.go rename to local/helper/types.go index f615232c26f1327d6f9f70577325538cee6c76fc..ecc92d7ed14dc7ccd0349c7c03d66cc4d51dd6d7 100644 --- a/local/types/types.go +++ b/local/helper/types.go @@ -1,4 +1,4 @@ -package types +package helper import "fmt" diff --git a/local/server/azure_handler.go b/local/server/azure_handler.go deleted file mode 100644 index 1b47a152276b3c3902544e7ed5d412d9ab137892..0000000000000000000000000000000000000000 --- a/local/server/azure_handler.go +++ /dev/null @@ -1,23 +0,0 @@ -package main - -import ( - azblob "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" -) - -var client *azblob.Client -var err error - -func connectToStorage(connectionString string) { - client, err = azblob.NewClientFromConnectionString(connectionString, nil) - if err != nil { - panic(err) - } -} - -func readFromStorage() { - //TODO: Implements -} - -func writeToStorage() { - //TODO: Implements -} diff --git a/local/server/server b/local/server/server index 01732317ff6d08d160ce5af4ac8a8fd228ca3146..25ed6495d57d4b136f22180d8b68eec849929d32 100755 Binary files a/local/server/server and b/local/server/server differ diff --git a/local/server/server.go b/local/server/server.go index e827247a8c864435159dcd624534df3f35f5c3c7..dde5c33235489a5c6f88fd4dcb2baa3224f494e2 100644 --- a/local/server/server.go +++ b/local/server/server.go @@ -3,23 +3,24 @@ package main import ( "encoding/json" "fmt" + dotenv "github.com/joho/godotenv" "gopkg.in/yaml.v2" - types "local/types" + helper "local/helper" "net" "os" ) type Config struct { - Id int `yaml:"id"` - Address string `yaml:"address"` - Neighbours []types.Node `yaml:"neighbours"` + Id int `yaml:"id"` + Address string `yaml:"address"` + Neighbours []helper.Node `yaml:"neighbours"` } -var transactions []types.Transaction +var transactions []helper.Transaction var config Config -var node types.CurrentNode +var node helper.CurrentNode const ( ServerPort = "8017" @@ -30,10 +31,14 @@ var server net.Listener var proactive string func main() { + dotenv.Load() + args := os.Args yaml := fmt.Sprintf("../neighbour-%s.yaml", args[1]) config := parseYAML(yaml) initNodeFromConfig(config) + connectionString := os.Getenv("AZ_STORAGE_CONNECTION_STRING") + helper.ConnectToStorage(connectionString) fmt.Printf("Loaded yaml file: %s\n", yaml) @@ -59,7 +64,7 @@ func main() { } func initNodeFromConfig(config Config) { - node = types.CurrentNode{ + node = helper.CurrentNode{ Address: config.Address, Neighbours: config.Neighbours, Reached: false, @@ -77,7 +82,7 @@ func processClient(connection net.Conn) { fmt.Println("Error reading:", err.Error()) } - var m types.Message + var m helper.Message err = json.Unmarshal(buffer[:mlen], &m) if err != nil { panic(err) @@ -86,10 +91,10 @@ func processClient(connection net.Conn) { fmt.Printf("%s\n", m.String()) switch m.Action { - case types.MCreateTransaction: + case helper.MCreateTransaction: createTransaction(connection, m.Transaction) break - case types.MListTransactions: + case helper.MListTransactions: listTransactions(connection) break default: @@ -113,7 +118,7 @@ func parseYAML(file string) Config { return config } -func createTransaction(connection net.Conn, t types.Transaction) { +func createTransaction(connection net.Conn, t helper.Transaction) { if !isTransactionKnown(t) { transactions = append(transactions, t) broadcastTransaction(connection, t) @@ -121,8 +126,8 @@ func createTransaction(connection net.Conn, t types.Transaction) { } func listTransactions(connection net.Conn) { - m := types.Message{ - Action: types.MListTransactions, + m := helper.Message{ + Action: helper.MListTransactions, Proactive: proactive, Transactions: transactions, } @@ -135,7 +140,7 @@ func listTransactions(connection net.Conn) { defer connection.Close() } -func broadcastTransaction(connection net.Conn, t types.Transaction) { +func broadcastTransaction(connection net.Conn, t helper.Transaction) { fmt.Printf("Starting transaction broadcast\n") sendTransactionToNeighbours(t) @@ -145,21 +150,21 @@ func broadcastTransaction(connection net.Conn, t types.Transaction) { } -func sendTransactionToNeighbours(t types.Transaction) { +func sendTransactionToNeighbours(t helper.Transaction) { for _, n := range node.Neighbours { sendTransactionToServer(t, n.Address) } } -func sendTransactionToServer(t types.Transaction, address string) { +func sendTransactionToServer(t helper.Transaction, address string) { fmt.Printf("Sending transaction %s to server [%s]\n", t.String(), address) connection, err := net.Dial(ServerType, fmt.Sprintf("%s:%s", address, ServerPort)) if err != nil { panic(err) } - m := types.Message{ - Action: types.MCreateTransaction, + m := helper.Message{ + Action: helper.MCreateTransaction, Transaction: t, Proactive: proactive, } @@ -172,7 +177,7 @@ func sendTransactionToServer(t types.Transaction, address string) { } -func isTransactionKnown(t types.Transaction) bool { +func isTransactionKnown(t helper.Transaction) bool { for _, transaction := range transactions { if transaction.Id == t.Id { fmt.Printf("Transaction already exists\n") diff --git a/local/server/test.json b/local/server/test.json new file mode 100644 index 0000000000000000000000000000000000000000..928198104245dc2934591a4f28edd762155a7553 --- /dev/null +++ b/local/server/test.json @@ -0,0 +1,16 @@ +{ + "transactions": [ + { + "id": 1, + "from": "Peiry", + "to": "Troller", + "amount": 6000 + }, + { + "id": 2, + "from": "Birner", + "to": "Peiry", + "amount": 2000 + } + ] +} \ No newline at end of file