From 74d198002c940c658af1fe2f675c0c8ecf694ea6 Mon Sep 17 00:00:00 2001 From: msanlli Date: Sat, 11 Jan 2025 20:51:16 +0100 Subject: [PATCH 1/2] delete old packet sender --- packet-sender/.env | 4 - packet-sender/.gitignore | 24 --- packet-sender/PacketGenerator.go | 319 ------------------------------- packet-sender/README.md | 42 ---- packet-sender/go.mod | 43 ----- packet-sender/go.sum | 207 -------------------- packet-sender/main.go | 108 ----------- 7 files changed, 747 deletions(-) delete mode 100644 packet-sender/.env delete mode 100644 packet-sender/.gitignore delete mode 100644 packet-sender/PacketGenerator.go delete mode 100644 packet-sender/README.md delete mode 100644 packet-sender/go.mod delete mode 100644 packet-sender/go.sum delete mode 100644 packet-sender/main.go diff --git a/packet-sender/.env b/packet-sender/.env deleted file mode 100644 index ae9ef8632..000000000 --- a/packet-sender/.env +++ /dev/null @@ -1,4 +0,0 @@ -EXCEL_ADAPTER_ID="1b_nOrWqjMLOSEFIV9dMUObnJ15J7ypmF-KVJ4qztAtw" -EXCEL_ADAPTER_NAME="ade.xlsx" -EXCEL_ADAPTER_PATH="." -EXCEL_ADAPTER_CREDENTIALS="./secret.json" diff --git a/packet-sender/.gitignore b/packet-sender/.gitignore deleted file mode 100644 index 50cbea71a..000000000 --- a/packet-sender/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib -packet-sender -packet_sender - -# Test binary, built with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Dependency directories (remove the comment below to include it) -# vendor/ - -# Workspace configuration -secret.json -excel.xlsx -.vscode - -*.xlsx diff --git a/packet-sender/PacketGenerator.go b/packet-sender/PacketGenerator.go deleted file mode 100644 index 53693aaf2..000000000 --- a/packet-sender/PacketGenerator.go +++ /dev/null @@ -1,319 +0,0 @@ -package main - -import ( - "bytes" - "encoding/binary" - "log" - "math" - "math/rand" - "strconv" - "strings" - "time" - - excelAdapter "github.com/HyperloopUPV-H8/h9-backend/pkg/excel_adapter" - "github.com/HyperloopUPV-H8/h9-backend/pkg/excel_adapter/internals" - "github.com/HyperloopUPV-H8/h9-backend/pkg/excel_adapter/models" -) - -type PacketGenerator struct { - packets []Packet -} - -func New() PacketGenerator { - excelAdapter := excelAdapter.New(excelAdapter.ExcelAdapterConfig{ - Download: internals.DownloadConfig{ - Id: "1NyNaAOw_6iWtnCpEg73AtSSFx1fMdhPRmmdOhjgjCZI", - Path: ".", - Name: "ade.xlsx", - }, - Parse: internals.ParseConfig{ - GlobalSheetPrefix: "GLOBAL ", - BoardSheetPrefix: "BOARD ", - TablePrefix: "[TABLE] ", - Global: internals.GlobalParseConfig{ - AddressTable: "addresses", - BackendKey: "Backend", - BLCUAddressKey: "BLCU", - UnitsTable: "units", - PortsTable: "ports", - BoardIdsTable: "board_ids", - MessageIdsTable: "message_ids", - }, - }, - }) - - boards := excelAdapter.GetBoards() - packets := make([]Packet, 0) - - for _, board := range boards { - for _, packet := range board.Packets { - if packet.Description.Type != "data" { - continue - } - - id, err := strconv.ParseUint(packet.Description.ID, 10, 16) - if err != nil { - log.Fatalf("data transfer: AddPacket: %s\n", err) - } - - packets = append(packets, Packet{ - ID: uint16(id), - Name: packet.Description.Name, - HexValue: "", - Count: 0, - CycleTime: 0, - Measurements: getMeasurements(packet.Values), - }) - } - } - - pg := PacketGenerator{ - packets: packets, - } - - return pg -} - -func (pg *PacketGenerator) CreateRandomPacket() []byte { - randomIndex := rand.Int63n(int64(len(pg.packets))) - randomPacket := pg.packets[randomIndex] - - buff := bytes.NewBuffer(make([]byte, 0)) - - binary.Write(buff, binary.LittleEndian, randomPacket.ID) - - for _, measurement := range randomPacket.Measurements { - if strings.Contains(measurement.Type, "enum") { - binary.Write(buff, binary.LittleEndian, uint8(rand.Int63n(int64(len(strings.Split(strings.ReplaceAll(strings.TrimSuffix(strings.TrimPrefix(measurement.Type, "enum("), ")"), " ", ""), ",")))))) - } else if measurement.Type == "bool" { - binary.Write(buff, binary.LittleEndian, rand.Int31n(2) == 1) - } else if measurement.Type != "string" { - var number float64 - if len(measurement.WarningRange) == 0 { - number = mapNumberToRange(rand.Float64(), measurement.WarningRange, measurement.Type) - } else { - number = mapNumberToRange(rand.Float64(), []float64{measurement.WarningRange[0] * 0.8, measurement.WarningRange[1] * 1.2}, measurement.Type) - } - writeNumberAsBytes(number, measurement.Type, buff) - } else { - return nil - } - - } - - return buff.Bytes() -} - -func (pg *PacketGenerator) CreateSinePacket() []byte { - randomIndex := rand.Int63n(int64(len(pg.packets))) - randomPacket := pg.packets[randomIndex] - - buff := bytes.NewBuffer(make([]byte, 0)) - - binary.Write(buff, binary.LittleEndian, randomPacket.ID) - - for _, measurement := range randomPacket.Measurements { - if strings.Contains(measurement.Type, "enum") { - binary.Write(buff, binary.LittleEndian, uint8(1)) - } else if measurement.Type != "string" { - sineValue := generateSinusoidalValue() - number := mapNumberToRange(sineValue, measurement.SafeRange, measurement.Type) - writeNumberAsBytes(number, measurement.Type, buff) - } else { - return nil - } - } - - return buff.Bytes() -} - -func generateSinusoidalValue() float64 { - amplitude := 1.0 - frequency := 0.01 - phase := 0.0 - - value := amplitude * math.Sin(2*math.Pi*frequency*float64(time.Now().Unix())+phase) - return value -} - -func mapNumberToRange(number float64, numberRange []float64, numberType string) float64 { - if len(numberRange) == 0 { - return number * getTypeMaxValue(numberType) - } else { - return (number * (numberRange[1] - numberRange[0])) + numberRange[0] - } -} - -func getTypeMaxValue(numberType string) float64 { - switch numberType { - case "uint8": - return math.MaxUint8 - case "uint16": - return math.MaxUint16 - case "uint32": - return math.MaxUint32 - case "uint64": - return math.MaxUint64 - case "int8": - return math.MaxInt8 - case "int16": - return math.MaxInt16 - case "int32": - return math.MaxInt32 - case "int64": - return math.MaxInt64 - case "float32": - return math.MaxFloat32 - case "float64": - return math.MaxFloat64 - case "bool": - return math.MaxUint8 - default: - return math.MaxUint8 - } -} - -func writeNumberAsBytes(number float64, numberType string, buff *bytes.Buffer) { - switch numberType { - case "uint8": - binary.Write(buff, binary.LittleEndian, uint8(number)) - case "uint16": - binary.Write(buff, binary.LittleEndian, uint16(number)) - - case "uint32": - binary.Write(buff, binary.LittleEndian, uint32(number)) - - case "uint64": - binary.Write(buff, binary.LittleEndian, uint64(number)) - - case "int8": - binary.Write(buff, binary.LittleEndian, int8(number)) - - case "int16": - binary.Write(buff, binary.LittleEndian, int16(number)) - - case "int32": - binary.Write(buff, binary.LittleEndian, int32(number)) - - case "int64": - binary.Write(buff, binary.LittleEndian, int64(number)) - - case "float32": - binary.Write(buff, binary.LittleEndian, float32(number)) - - case "float64": - binary.Write(buff, binary.LittleEndian, number) - - case "bool": - binary.Write(buff, binary.LittleEndian, uint8(number)) - - default: - binary.Write(buff, binary.LittleEndian, uint8(number)) - } -} - -func (pg *PacketGenerator) AddPacket(boardName string, packet models.Packet) { - if packet.Description.Type != "data" { - return - } - - id, err := strconv.ParseUint(packet.Description.ID, 10, 16) - if err != nil { - log.Fatalf("data transfer: AddPacket: %s\n", err) - } - - pg.packets = append(pg.packets, Packet{ - ID: uint16(id), - Name: packet.Description.Name, - HexValue: "", - Count: 0, - CycleTime: 0, - Measurements: getMeasurements(packet.Values), - }) - -} - -func getMeasurements(values []models.Value) []Measurement { - measurements := make([]Measurement, 0, len(values)) - for _, value := range values { - measurements = append(measurements, - Measurement{ - ID: value.ID, - Name: value.Name, - Type: value.Type, - //TODO: make sure added property (Value) doesn't break stuff - Value: getDefaultValue(value.Type), - Units: value.DisplayUnits, - SafeRange: parseRange(value.SafeRange), - WarningRange: parseRange(value.WarningRange), - }, - ) - } - return measurements -} - -func parseRange(literal string) []float64 { - if literal == "" { - return make([]float64, 0) - } - - strRange := strings.Split(strings.TrimSuffix(strings.TrimPrefix(strings.Replace(literal, " ", "", -1), "["), "]"), ",") - - if len(strRange) != 2 { - log.Fatalf("pod data: parseRange: invalid range %s\n", literal) - } - - numRange := make([]float64, 0) - - if strRange[0] != "" { - lowerBound, errLowerBound := strconv.ParseFloat(strRange[0], 64) - - if errLowerBound != nil { - log.Fatal("error parsing lower bound") - } - - numRange = append(numRange, lowerBound) - } - - if strRange[1] != "" { - upperBound, errUpperBound := strconv.ParseFloat(strRange[1], 64) - - if errUpperBound != nil { - log.Fatal("error parsing lower bound") - } - - numRange = append(numRange, upperBound) - } - - return numRange -} - -func getDefaultValue(valueType string) any { - switch valueType { - case "uint8", "uint16", "uint32", "uint64", "int8", "int16", "int32", "int64", "float32", "float64": - return 0 - case "bool": - return false - default: - return "Default" - } -} - -type Packet struct { - ID uint16 `json:"id"` - Name string `json:"name"` - HexValue string `json:"hexValue"` - Count uint16 `json:"count"` - CycleTime int64 `json:"cycleTime"` - Measurements []Measurement `json:"measurements"` -} - -type Measurement struct { - ID string `json:"id"` - Name string `json:"name"` - Type string `json:"type"` - Value any `json:"value"` - Units string `json:"units"` - SafeRange []float64 `json:"safeRange"` - WarningRange []float64 `json:"warningRange"` -} diff --git a/packet-sender/README.md b/packet-sender/README.md deleted file mode 100644 index ca50f7147..000000000 --- a/packet-sender/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Packet Sender - -Small utility to generate mock traffic to test the backend. - -## Features - -- Automatically fetch the ADE. -- Generate random values for numerics -- Supports all types of data -- It's over 9000 packets per second!!! - -## Run Locally - -Clone the project - -```bash -git clone https://github.com/HyperloopUPV-H8/packet-sender.git -``` - -Go to the project directory - -```bash -cd packet-sender -``` - -Edit go.mod and add the replacement directive at the end of the file - -```bash -echo "replace github.com/HyperloopUPV-H8/Backend-H8 => " >> go.mod -``` - -Build and Run - -```bash -go build && ./packet-sender -``` - -## Authors - -- [Juan Martinez Alonso](https://www.github.com/jmaralo) -- [Sergio Moreno Suay](https://www.github.com/smorsua) -- [Felipe Zaballa Martienz](https://www.github.com/lipezaballa) diff --git a/packet-sender/go.mod b/packet-sender/go.mod deleted file mode 100644 index 3afd8d3f7..000000000 --- a/packet-sender/go.mod +++ /dev/null @@ -1,43 +0,0 @@ -module packet_sender - -go 1.19 - -require ( - github.com/HyperloopUPV-H8/h9-backend v0.0.0-00010101000000-000000000000 - github.com/joho/godotenv v1.4.0 -) - -require ( - cloud.google.com/go/compute v1.19.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - github.com/HyperloopUPV-H8/ade-linter v0.0.0-20230530153315-3379f05a664f // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect - github.com/richardlehane/mscfb v1.0.4 // indirect - github.com/richardlehane/msoleps v1.0.3 // indirect - github.com/rs/zerolog v1.29.0 // indirect - github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect - github.com/xuri/excelize/v2 v2.7.1 // indirect - github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect - go.opencensus.io v0.24.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.7.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - google.golang.org/api v0.114.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect - google.golang.org/grpc v1.56.3 // indirect - google.golang.org/protobuf v1.30.0 // indirect -) - -replace github.com/HyperloopUPV-H8/h9-backend => ../backend diff --git a/packet-sender/go.sum b/packet-sender/go.sum deleted file mode 100644 index de5c1d2d5..000000000 --- a/packet-sender/go.sum +++ /dev/null @@ -1,207 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/HyperloopUPV-H8/ade-linter v0.0.0-20230530153315-3379f05a664f h1:WxWQzMMuGKBTZZ1c/z+4cHckI3FxOpdoBl6kUpu1L/o= -github.com/HyperloopUPV-H8/ade-linter v0.0.0-20230530153315-3379f05a664f/go.mod h1:y2zH0pjAkyEirrmjDq/O3lg03whnTSk5KPtQwJLr0Q4= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= -github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= -github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= -github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= -github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM= -github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w= -github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c= -github.com/xuri/efp v0.0.0-20220603152613-6918739fd470/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= -github.com/xuri/excelize/v2 v2.7.1 h1:gm8q0UCAyaTt3MEF5wWMjVdmthm2EHAWesGSKS9tdVI= -github.com/xuri/excelize/v2 v2.7.1/go.mod h1:qc0+2j4TvAUrBw36ATtcTeC1VCM0fFdAXZOmcF4nTpY= -github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 h1:OAmKAfT06//esDdpi/DZ8Qsdt4+M5+ltca05dA5bG2M= -github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= -golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/packet-sender/main.go b/packet-sender/main.go deleted file mode 100644 index 4c5abcc19..000000000 --- a/packet-sender/main.go +++ /dev/null @@ -1,108 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net" - "os" - "os/signal" - "time" - - "github.com/joho/godotenv" -) - -const ( - lip string = "127.0.0.3" - lport uint16 = 50400 - rip string = "127.0.0.4" - rport uint16 = 50400 -) - -func main() { - err := godotenv.Load(".env") - - if err != nil { - log.Fatal("Error loading .env", err) - } - - _ = createListener(lip, lport, rip, rport) - conn := getConn(lip, lport, rip, rport) - defer conn.Close() - - packetGenerator := New() - fmt.Println("Sending packets") - - count := make(chan struct{}, 10000) - start := time.Now() - prev := time.Now() - go func() { - for { - packet := packetGenerator.CreateRandomPacket() - fmt.Println(time.Since(prev)) - prev = time.Now() - - if packet == nil { - continue - } - _, err := conn.Write(packet) - - if err != nil { - continue - } - - count <- struct{}{} - } - - }() - - interrupt := make(chan os.Signal, 1) - signal.Notify(interrupt, os.Interrupt) - - c := 0 - for { - select { - case <-count: - c++ - case <-interrupt: - fmt.Printf("%d, %v\n", c, time.Since(start)) - return - } - } - -} - -func getConn(lip string, lport uint16, rip string, rport uint16) *net.UDPConn { - laddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", lip, lport)) - if err != nil { - log.Fatalf("resolve address: %s\n", err) - } - raddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", rip, rport)) - if err != nil { - log.Fatalf("resolve address: %s\n", err) - } - conn, err := net.DialUDP("udp", laddr, raddr) - - if err != nil { - log.Fatal("Error creating udp connection", err) - } - - return conn -} - -func createListener(lip string, lport uint16, rip string, rport uint16) *net.UDPConn { - _, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", lip, lport)) - if err != nil { - log.Fatalf("resolve address: %s\n", err) - } - laddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", rip, rport)) - if err != nil { - log.Fatalf("resolve address: %s\n", err) - } - listener, err := net.ListenUDP("udp", laddr) - - if err != nil { - log.Fatal("Error creating udp connection", err) - } - - return listener -} From ae20ca8894615c424e06eec3d88c54f343062ef9 Mon Sep 17 00:00:00 2001 From: msanlli Date: Mon, 3 Feb 2025 19:36:15 +0100 Subject: [PATCH 2/2] force the pass of ADJ tests --- backend/cmd/main.go | 8 +++++ backend/cmd/{testpython.py => testadj.py} | 41 ++++++++++------------- 2 files changed, 25 insertions(+), 24 deletions(-) rename backend/cmd/{testpython.py => testadj.py} (90%) diff --git a/backend/cmd/main.go b/backend/cmd/main.go index a8ad0e2a9..2f18bc11d 100644 --- a/backend/cmd/main.go +++ b/backend/cmd/main.go @@ -12,6 +12,7 @@ import ( "net/http" _ "net/http/pprof" "os" + "os/exec" "os/signal" "path" "runtime" @@ -105,6 +106,13 @@ func main() { trace.Fatal().Err(err).Msg("setting up ADJ") } + test := exec.Command("python3", "testadj.py") + out, err := test.CombinedOutput() + if err != nil || len(out) != 0 { + fmt.Printf("\nPython test failed:\nError: %v\nOutput: %s\n", err, string(out)) + os.Exit(1) + } + podData, err := pod_data.NewPodData(adj.Boards, adj.Info.Units) if err != nil { fmt.Println(err) diff --git a/backend/cmd/testpython.py b/backend/cmd/testadj.py similarity index 90% rename from backend/cmd/testpython.py rename to backend/cmd/testadj.py index 955e63f6e..72ba3c160 100644 --- a/backend/cmd/testpython.py +++ b/backend/cmd/testadj.py @@ -1,12 +1,10 @@ import os import json -from collections import Counter def validate_json_structure(data): errors = [] - if "board_id" in data: if not isinstance(data["board_id"], int): errors.append(f"'board_id' debe ser un entero, pero se encontró: {type(data['board_id']).__name__}.") @@ -15,13 +13,13 @@ def validate_json_structure(data): if not isinstance(data["board_ip"], str): errors.append(f"'board_ip' debe ser una cadena, pero se encontró: {type(data['board_ip']).__name__}.") - + if "measurements" in data: if not isinstance(data["measurements"], list): errors.append("La clave 'measurements' debe ser una lista.") else: for measurement in data["measurements"]: - if isinstance(measurement, dict): + if isinstance(measurement, dict): required_keys = ["id", "name", "type", "podUnits", "displayUnits"] for key in required_keys: if key not in measurement: @@ -40,17 +38,17 @@ def validate_json_structure(data): errors.append(f"El 'podUnits' debe ser una cadena en: {measurement}") if "podUnits" in measurement and not isinstance(measurement["podUnits"], str): errors.append(f"El 'podUnits' debe ser una cadena en: {measurement}") #esto se puede quitar (json 516) - elif not isinstance(measurement, str): + elif not isinstance(measurement, str): errors.append("Cada elemento en 'measurements' debe ser un objeto o una cadena (nombre de archivo).") - + if "packets" in data: if not isinstance(data["packets"], list): errors.append("La clave 'packets' debe ser una lista.") else: for packet in data["packets"]: - if isinstance(packet, dict): - required_keys = ["id", "name", "type","variable"] + if isinstance(packet, dict): + required_keys = ["id", "name", "type","variable"] for key in required_keys: if key not in packet: errors.append(f"Falta la clave '{key}' en un objeto de 'packets'.") @@ -69,7 +67,7 @@ def validate_json_structure(data): errors.append(f"Cada elemento en 'variables' debe ser un objeto en: {packet}") if "name" not in variable: errors.append(f"Falta la clave 'name' en un objeto de 'variables' en: {packet}") - elif not isinstance(packet, str): + elif not isinstance(packet, str): errors.append("Cada elemento en 'packets' debe ser un objeto o una cadena (nombre de archivo).") return errors @@ -78,19 +76,19 @@ def validate_json_structure(data): def validate_json_folder(folder_path): boards_file_path = os.path.join(folder_path, "boards.json") - + try: with open(boards_file_path, 'r') as boards_file: boards_data = json.load(boards_file) boards = boards_data.get("boards", {}) - - + + board_keys = list(boards.keys()) duplicate_keys = [key for key in board_keys if board_keys.count(key) > 1] - + if duplicate_keys: print(f"Error: El archivo boards.json contiene claves duplicadas: {', '.join(duplicate_keys)}") - return + return except json.JSONDecodeError as e: print(f"Error al decodificar JSON en {boards_file_path}: {e}") @@ -99,7 +97,7 @@ def validate_json_folder(folder_path): print(f"Error al procesar el archivo {boards_file_path}: {e}") return - + for board_name, board_file_path in boards.items(): full_path = os.path.join(folder_path, board_file_path) try: @@ -110,19 +108,14 @@ def validate_json_folder(folder_path): print(f"Errores encontrados en {full_path} para la placa '{board_name}':") for error in errors: print(f"- {error}") - else: - print(f"{full_path} para la placa '{board_name}' está bien estructurado.") + except json.JSONDecodeError as e: print(f"Error al decodificar JSON en {full_path}: {e}") except Exception as e: - print(f"Error al procesar el archivo {full_path}: {e}") - - + print(f"Error al procesar el archivo {full_path}: {e}") -if os.path.exists('./JSON_ADE/'): - print("La carpeta JSON_ADE existe") -else: +if os.path.exists('./JSON_ADE/') == False: print("La carpeta JSON_ADE no existe") if __name__ == "__main__": - validate_json_folder("./JSON_ADE/") + validate_json_folder("./JSON_ADE/")