Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
802249b
Add python test
JESUSJH18 Dec 30, 2024
df3c690
Python test
JESUSJH18 Dec 30, 2024
d212e13
Func modifications
JESUSJH18 Jan 5, 2025
a8930cb
Module import change
JESUSJH18 Jan 6, 2025
20d33dd
Merge branch 'main' into backend/python_test
JESUSJH18 Jan 6, 2025
02119cc
Merge branch 'main' into backend/packet-sender
JESUSJH18 Jan 6, 2025
f81e022
Merge pull request #192 from HyperloopUPV-H8/main
msanlli Jan 7, 2025
9c3ebf4
Merge branch 'develop' into backend/python_test
JESUSJH18 Jan 7, 2025
04fe9ee
Merge pull request #189 from HyperloopUPV-H8/backend/python_test
JESUSJH18 Jan 7, 2025
bf3d23b
tidy mod
msanlli Jan 8, 2025
5f3258f
Update READMEs (#193)
msanlli Jan 10, 2025
56598d9
Update READMEs (#194)
msanlli Jan 10, 2025
d1278f7
Merge pull request #195 from HyperloopUPV-H8/main
msanlli Jan 10, 2025
74d1980
delete old packet sender
msanlli Jan 11, 2025
bac1c3e
Correct import + copy adj in pkg
JESUSJH18 Jan 29, 2025
ae20ca8
force the pass of ADJ tests
msanlli Feb 3, 2025
3502878
Merge pull request #201 from HyperloopUPV-H8/main
msanlli Feb 3, 2025
a9e85ed
Merge branch 'develop' into backend/enforce-adj-test
msanlli Feb 3, 2025
90abfd9
Merge pull request #202 from HyperloopUPV-H8/main
msanlli Feb 3, 2025
47df57e
Merge branch 'develop' into backend/enforce-adj-test
msanlli Feb 3, 2025
b2d63d0
update
JESUSJH18 Feb 6, 2025
b3d09a4
Port solution for windows
JESUSJH18 Feb 6, 2025
8f9a9ad
adapt config to ADJ
msanlli Feb 6, 2025
ea604f2
adapt main to branch selector
msanlli Feb 6, 2025
2e0ad3c
fix config struct
msanlli Feb 6, 2025
da47901
adjust main to new struct
msanlli Feb 6, 2025
6ce939a
git plumbing
msanlli Feb 7, 2025
e09bbda
make toml select adj main by default
msanlli Feb 7, 2025
a5f7b66
Merge pull request #200 from HyperloopUPV-H8/backend/enforce-adj-test
msanlli Feb 7, 2025
bdc9a5e
Merge branch 'develop' into backend/submodule-adj
msanlli Feb 7, 2025
c1f026c
Change port (front)
JESUSJH18 Feb 7, 2025
b5f4f0f
fix conflicts
JESUSJH18 Feb 7, 2025
9be6f04
Merge branch 'backend/packet-sender' of https://github.com/HyperloopU…
JESUSJH18 Feb 7, 2025
a519084
Remove.env from main
JESUSJH18 Feb 7, 2025
703b098
Merge pull request #204 from HyperloopUPV-H8/backend/packet-sender
JESUSJH18 Feb 8, 2025
dbadf8d
Merge branch 'develop' into backend/submodule-adj
msanlli Feb 8, 2025
3054467
Merge pull request #203 from HyperloopUPV-H8/backend/submodule-adj
msanlli Feb 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions backend/cmd/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ import (
"github.com/HyperloopUPV-H8/h9-backend/internal/vehicle"
)

type Adj struct {
Branch string
}
type Config struct {
Vehicle vehicle.Config
Server server.Config
Adj Adj
}
5 changes: 4 additions & 1 deletion backend/cmd/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,7 @@ connections = "/backend"
files = "/"

[vehicle]
boardsList = ["VCU"]
boardsList = ["VCU"]

[adj]
branch = "main" # Leave blank when using ADJ as a submodule
13 changes: 11 additions & 2 deletions backend/cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"net/http"
_ "net/http/pprof"
"os"
"os/exec"
"os/signal"
"path"
"runtime"
Expand Down Expand Up @@ -96,15 +97,23 @@ func main() {
defer pprof.StopCPUProfile()
}
runtime.SetBlockProfileRate(*blockprofile)

config := getConfig("./config.toml")

// <--- ADJ --->

adj, err := adj_module.NewADJ()
adj, err := adj_module.NewADJ(config.Adj.Branch)
if err != nil {
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)
Expand Down Expand Up @@ -558,7 +567,7 @@ func getIPIPfilter() string {
return "ip[9] == 4"
}

func getUDPFilter(addrs []net.IP, backendAddr net.IP, port uint16) string {
func getUDPFilter(addrs []net.IP, backendAddr net.IP, _ uint16) string {
udpPort := "udp" // TODO use proper ports for the filter
srcUdpAddrs := common.Map(addrs, func(addr net.IP) string {
return fmt.Sprintf("(src host %s)", addr)
Expand Down
121 changes: 121 additions & 0 deletions backend/cmd/testadj.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
import os
import json


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__}.")

if "board_ip" in 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):
required_keys = ["id", "name", "type", "podUnits", "displayUnits"]
for key in required_keys:
if key not in measurement:
errors.append(f"Falta la clave '{key}' en un objeto de 'measurements'.")
if "id" in measurement and not isinstance(measurement["id"], str):
errors.append(f"El 'id' debe ser una cadena en: {measurement}")
if "name" in measurement and not isinstance(measurement["name"], str):
errors.append(f"El 'name' debe ser una cadena en: {measurement}")
if "type" in measurement and not isinstance(measurement["type"], str):
errors.append(f"El 'type' debe ser una cadena en: {measurement}")
if "safeRange" in measurement and not isinstance(measurement.get("safeRange", []), list):
errors.append(f"'safeRange' debe ser una lista en: {measurement}")
if "warningRange" in measurement and not isinstance(measurement.get("warningRange", []), list):
errors.append(f"'warningRange' debe ser una lista en: {measurement}")
if "displayUnits" in measurement and not isinstance(measurement["displayUnits"], str):
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):
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"]
for key in required_keys:
if key not in packet:
errors.append(f"Falta la clave '{key}' en un objeto de 'packets'.")
if "id" in packet and not isinstance(packet["id"], str):
errors.append(f"El 'id' debe ser una cadena en: {packet}")
if "name" in packet and not isinstance(packet["name"], str):
errors.append(f"El 'name' debe ser una cadena en: {packet}")
if "type" in packet and not isinstance(packet["type"], str):
errors.append(f"El 'type' debe ser una cadena en: {packet}")
if "variables" in packet:
if not isinstance(packet["variables"], list):
errors.append(f"'variables' debe ser una lista en: {packet}")
else:
for variable in packet["variables"]:
if not isinstance(variable, dict):
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):
errors.append("Cada elemento en 'packets' debe ser un objeto o una cadena (nombre de archivo).")

return errors



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

except json.JSONDecodeError as e:
print(f"Error al decodificar JSON en {boards_file_path}: {e}")
return
except Exception as e:
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:
with open(full_path, 'r') as board_file:
data = json.load(board_file)
errors = validate_json_structure(data)
if errors:
print(f"Errores encontrados en {full_path} para la placa '{board_name}':")
for error in errors:
print(f"- {error}")

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}")


if os.path.exists('./JSON_ADE/') == False:
print("La carpeta JSON_ADE no existe")
if __name__ == "__main__":
validate_json_folder("./JSON_ADE/")
22 changes: 1 addition & 21 deletions backend/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,18 @@ module github.com/HyperloopUPV-H8/h9-backend
go 1.21.3

require (
github.com/HyperloopUPV-H8/ade-linter v0.0.0-20230530153315-3379f05a664f
github.com/go-git/go-git/v5 v5.12.0
github.com/google/gopacket v1.1.19
github.com/google/uuid v1.3.0
github.com/gorilla/websocket v1.5.0
github.com/jmaralo/sntp v0.0.0-20240116111937-45a0a3419272
github.com/pelletier/go-toml/v2 v2.0.7
github.com/pin/tftp/v3 v3.0.0
github.com/pkg/errors v0.9.1
github.com/rs/zerolog v1.29.0
github.com/xuri/excelize/v2 v2.7.1
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1
google.golang.org/api v0.114.0
)

require (
cloud.google.com/go/compute v1.19.1 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect
dario.cat/mergo v1.0.0 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/ProtonMail/go-crypto v1.0.0 // indirect
Expand All @@ -30,33 +24,19 @@ require (
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
github.com/go-git/go-billy/v5 v5.5.0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect
github.com/googleapis/gax-go/v2 v2.7.1 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/kevinburke/ssh_config v1.2.0 // 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/pjbgf/sha1cd v0.3.0 // indirect
github.com/richardlehane/mscfb v1.0.4 // indirect
github.com/richardlehane/msoleps v1.0.3 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
github.com/skeema/knownhosts v1.2.2 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect
github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
go.opencensus.io v0.24.0 // indirect
golang.org/x/crypto v0.21.0 // indirect
golang.org/x/mod v0.12.0 // indirect
golang.org/x/oauth2 v0.7.0 // indirect
golang.org/x/sys v0.18.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.13.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
gopkg.in/warnings.v0 v0.1.2 // indirect
)

Expand Down
Loading
Loading