Skip to content
model_test.go 89.3 KiB
Newer Older
Michel Roy's avatar
Michel Roy committed
	ctx := m.GetNodeContext("NOT-A-NODE")
	if ctx != nil {
		t.Fatalf("Node context should not exist")
	fmt.Println("Get Deployment context")
	ctx = m.GetNodeContext("demo1")
	if ctx == nil {
		t.Fatalf("Node context should exist")
	nodeCtx, ok := ctx.(*NodeContext)
	if !ok || !validateNodeContext(nodeCtx, "demo1", "", "", "", "") {
		t.Fatalf("Invalid Deployment context")
Michel Roy's avatar
Michel Roy committed
	fmt.Println("Get Operator context")
	ctx = m.GetNodeContext("operator1")
	if ctx == nil {
		t.Fatalf("Node context should exist")
	nodeCtx, ok = ctx.(*NodeContext)
	if !ok || !validateNodeContext(nodeCtx, "demo1", "operator1", "", "", "") {
		t.Fatalf("Invalid Operator context")
Michel Roy's avatar
Michel Roy committed
	}
	fmt.Println("Get Zone context")
	ctx = m.GetNodeContext("zone1")
	if ctx == nil {
		t.Fatalf("Node context should exist")
	nodeCtx, ok = ctx.(*NodeContext)
	if !ok || !validateNodeContext(nodeCtx, "demo1", "operator1", "zone1", "", "") {
		t.Fatalf("Invalid Operator context")
Michel Roy's avatar
Michel Roy committed
	}
	fmt.Println("Get Net Location context")
	ctx = m.GetNodeContext("zone1-poa1")
	if ctx == nil {
		t.Fatalf("Node context should exist")
	nodeCtx, ok = ctx.(*NodeContext)
	if !ok || !validateNodeContext(nodeCtx, "demo1", "operator1", "zone1", "zone1-poa1", "") {
		t.Fatalf("Invalid Operator context")
Michel Roy's avatar
Michel Roy committed
	}
	fmt.Println("Get Phy Location context")
	ctx = m.GetNodeContext("zone1-fog1")
	if ctx == nil {
		t.Fatalf("Node context should exist")
	nodeCtx, ok = ctx.(*NodeContext)
	if !ok || !validateNodeContext(nodeCtx, "demo1", "operator1", "zone1", "zone1-poa1", "zone1-fog1") {
		t.Fatalf("Invalid Operator context")
Michel Roy's avatar
Michel Roy committed
	}
	fmt.Println("Get App context")
	ctx = m.GetNodeContext("ue1-iperf")
	if ctx == nil {
		t.Fatalf("Node context should exist")
	nodeCtx, ok = ctx.(*NodeContext)
	if !ok || !validateNodeContext(nodeCtx, "demo1", "operator1", "zone1", "zone1-poa1", "ue1") {
		t.Fatalf("Invalid Operator context")

	// Network Graph
	graph := m.GetNetworkGraph()
	if len(graph.Verticies) != 29 {
		t.Fatalf("Invalid Network Graph")
func TestScenarioUpdate(t *testing.T) {
	fmt.Println("--- ", t.Name())
	log.MeepTextLogInit(t.Name())

	// Switch to a different table for testing
	redisTable = modelRedisTestTable

	cfg := ModelCfg{Name: modelName, Namespace: moduleNamespace, Module: "test-mod", DbAddr: modelRedisAddr}
	m, err := NewModel(cfg)
	if err != nil {
		t.Fatalf("Unable to create model")
	}
	fmt.Println("Set Model")
	err = m.SetScenario([]byte(testScenario))
	if err != nil {
		t.Fatalf("Error setting model")
	}
	if m.scenario.Name != "demo1" {
		t.Fatalf("SetScenario failed")
	}

	fmt.Println("Invalid Add Requests")
	ue_data := dataModel.NodeDataUnion{}
	ue_node := dataModel.ScenarioNode{NodeDataUnion: &ue_data, Parent: "zone1-poa1"}
	err = m.AddScenarioNode(&ue_node, nil)
	if err == nil {
		t.Fatalf("Action should have failed")
	}
	ue_data = dataModel.NodeDataUnion{}
	ue_node = dataModel.ScenarioNode{Type_: NodeTypeUE, Parent: "zone1-poa1"}
	err = m.AddScenarioNode(&ue_node, nil)
	if err == nil {
		t.Fatalf("Action should have failed")
	}
	ue_data = dataModel.NodeDataUnion{}
	ue_node = dataModel.ScenarioNode{Type_: NodeTypeUE, NodeDataUnion: &ue_data}
	err = m.AddScenarioNode(&ue_node, nil)
	if err == nil {
		t.Fatalf("Action should have failed")
	}
	ue_data = dataModel.NodeDataUnion{}
	ue_node = dataModel.ScenarioNode{Type_: NodeTypeUE, NodeDataUnion: &ue_data, Parent: "zone1-poa1"}
	err = m.AddScenarioNode(&ue_node, nil)
	if err == nil {
		t.Fatalf("Action should have failed")
	}
	ue_pl := dataModel.PhysicalLocation{Id: "ue-id", Type_: NodeTypeUE}
	ue_data = dataModel.NodeDataUnion{PhysicalLocation: &ue_pl}
	ue_node = dataModel.ScenarioNode{Type_: NodeTypeUE, NodeDataUnion: &ue_data, Parent: "zone1-poa1"}
	err = m.AddScenarioNode(&ue_node, nil)
	if err == nil {
		t.Fatalf("Action should have failed")
	}
	ue_pl = dataModel.PhysicalLocation{Id: "ue-id", Name: "ue"}
	ue_data = dataModel.NodeDataUnion{PhysicalLocation: &ue_pl}
	ue_node = dataModel.ScenarioNode{Type_: NodeTypeUE, NodeDataUnion: &ue_data, Parent: "zone1-poa1"}
	err = m.AddScenarioNode(&ue_node, nil)
	if err == nil {
		t.Fatalf("Action should have failed")
	}
	ue1_pl := dataModel.PhysicalLocation{Id: "ue1-id", Name: "ue1", Type_: NodeTypeUE}
	ue1_data := dataModel.NodeDataUnion{PhysicalLocation: &ue1_pl}
	ue1_node := dataModel.ScenarioNode{Type_: NodeTypeUE, NodeDataUnion: &ue1_data, Parent: "zone1-poa1"}
	err = m.AddScenarioNode(&ue1_node, nil)
	if err == nil {
		t.Fatalf("Action should have failed")
	}

	fmt.Println("Invalid Remove Requests")
	ue_data = dataModel.NodeDataUnion{}
	ue_node = dataModel.ScenarioNode{NodeDataUnion: &ue_data}
	err = m.RemoveScenarioNode(&ue_node, nil)
	if err == nil {
		t.Fatalf("Action should have failed")
	}
	ue_data = dataModel.NodeDataUnion{}
	ue_node = dataModel.ScenarioNode{Type_: NodeTypeUE}
	err = m.RemoveScenarioNode(&ue_node, nil)
	if err == nil {
		t.Fatalf("Action should have failed")
	}
	ue_data = dataModel.NodeDataUnion{}
	ue_node = dataModel.ScenarioNode{Type_: NodeTypeUE, NodeDataUnion: &ue_data}
	err = m.RemoveScenarioNode(&ue_node, nil)
	if err == nil {
		t.Fatalf("Action should have failed")
	}
	ue_pl = dataModel.PhysicalLocation{Id: "ue-id", Type_: NodeTypeUE}
	ue_data = dataModel.NodeDataUnion{PhysicalLocation: &ue_pl}
	ue_node = dataModel.ScenarioNode{Type_: NodeTypeUE, NodeDataUnion: &ue_data}
	err = m.RemoveScenarioNode(&ue_node, nil)
	if err == nil {
		t.Fatalf("Action should have failed")
	}
	ue_pl = dataModel.PhysicalLocation{Id: "ue-id", Name: "ue"}
	ue_data = dataModel.NodeDataUnion{PhysicalLocation: &ue_pl}
	ue_node = dataModel.ScenarioNode{Type_: NodeTypeUE, NodeDataUnion: &ue_data}
	err = m.RemoveScenarioNode(&ue_node, nil)
	if err == nil {
		t.Fatalf("Action should have failed")
	}

	fmt.Println("Add ue3")
Kevin Di Lallo's avatar
Kevin Di Lallo committed
	ue3_nc := dataModel.NetworkCharacteristics{}
	ue3_pl := dataModel.PhysicalLocation{Id: "ue3-id", Name: "ue3", Type_: NodeTypeUE, NetChar: &ue3_nc}
	ue3_data := dataModel.NodeDataUnion{PhysicalLocation: &ue3_pl}
	ue3_node := dataModel.ScenarioNode{Type_: NodeTypeUE, NodeDataUnion: &ue3_data, Parent: "zone1-poa1"}
	err = m.AddScenarioNode(&ue3_node, nil)
Kevin Di Lallo's avatar
Kevin Di Lallo committed
		t.Fatalf("Error adding nodes: " + err.Error())
	}
	n := m.nodeMap.FindByName("ue3")
	if n == nil || n.name != "ue3" {
		t.Fatalf("Failed to add nodes")
	}
	p := n.parent.(*dataModel.NetworkLocation)
	if p == nil || p.Name != "zone1-poa1" {
		t.Fatalf("Failed to add nodes")
	}
	d := n.object.(*dataModel.PhysicalLocation)
	if d == nil || d.Name != "ue3" {
		t.Fatalf("Failed to add nodes")
	}

Kevin Di Lallo's avatar
Kevin Di Lallo committed
	ue4_nc := dataModel.NetworkCharacteristics{}
	ue4_pl := dataModel.PhysicalLocation{Id: "ue4-id", Name: "ue4", Type_: NodeTypeUE, NetChar: &ue4_nc}
	ue4_data := dataModel.NodeDataUnion{PhysicalLocation: &ue4_pl}
	ue4_node := dataModel.ScenarioNode{Type_: NodeTypeUE, NodeDataUnion: &ue4_data, Parent: "zone1-poa1"}
	err = m.AddScenarioNode(&ue4_node, nil)
Kevin Di Lallo's avatar
Kevin Di Lallo committed
		t.Fatalf("Error adding nodes: " + err.Error())
	}
	n = m.nodeMap.FindByName("ue4")
	if n == nil || n.name != "ue4" {
		t.Fatalf("Failed to add nodes")
	}
	p = n.parent.(*dataModel.NetworkLocation)
	if p == nil || p.Name != "zone1-poa1" {
		t.Fatalf("Failed to add nodes")
	}
	d = n.object.(*dataModel.PhysicalLocation)
	if d == nil || d.Name != "ue4" {
		t.Fatalf("Failed to add nodes")
	}

	fmt.Println("Remove ue4")
	ue4_node = dataModel.ScenarioNode{Type_: NodeTypeUE, NodeDataUnion: &ue4_data}
	err = m.RemoveScenarioNode(&ue4_node, nil)
		t.Fatalf("Error removing nodes")
	}
	n = m.nodeMap.FindByName("ue4")
	if n != nil {
		t.Fatalf("Failed to remove nodes")
	}

	fmt.Println("Remove ue3 & ue5")
	ue3_node = dataModel.ScenarioNode{Type_: NodeTypeUE, NodeDataUnion: &ue3_data}
	err = m.RemoveScenarioNode(&ue3_node, nil)
		t.Fatalf("Error removing nodes")
	}
	n = m.nodeMap.FindByName("ue3")
	if n != nil {
		t.Fatalf("Failed to remove nodes")
	}
}

func validateNodeContext(nodeCtx *NodeContext, deployment, domain, zone, netLoc, phyLoc string) bool {
	if nodeCtx.Parents[Deployment] != deployment ||
		nodeCtx.Parents[Domain] != domain ||
		nodeCtx.Parents[Zone] != zone ||
		nodeCtx.Parents[NetLoc] != netLoc ||
		nodeCtx.Parents[PhyLoc] != phyLoc {
		return false
	}
	return true
Michel Roy's avatar
Michel Roy committed
}

func TestValidateScenario(t *testing.T) {
	fmt.Println("--- ", t.Name())
	log.MeepTextLogInit(t.Name())

	ValidatorVersion = semver.Version{Major: 1, Minor: 6, Patch: 8}
	// Incompatible scenarios
	fmt.Println("Validate empty scenario")
Simon Pastor's avatar
Simon Pastor committed
	validJsonScenario, status, err := ValidateScenario([]byte(""), "")
	if validJsonScenario != nil || status != ValidatorStatusError || err == nil {
		t.Fatalf("Empty scenario should not be valid")
	fmt.Println("Validate scenario: scenarioVer[1.0.0] == too old")
Simon Pastor's avatar
Simon Pastor committed
	validJsonScenario, status, err = ValidateScenario([]byte(testScenario_v1_0_0), "")
	if validJsonScenario != nil || status != ValidatorStatusError || err == nil {
		t.Fatalf("validJsonScenario should not be compatible")
	fmt.Println("Validate scenario: scenarioVer[none] == validatorVer[latest]")
Simon Pastor's avatar
Simon Pastor committed
	validJsonScenario, status, err = ValidateScenario([]byte(testScenario), "")
	if validJsonScenario == nil || status != ValidatorStatusUpdated || err != nil {
		t.Fatalf("validJsonScenario should not be nil")
Kevin Di Lallo's avatar
Kevin Di Lallo committed
	// fmt.Println(string(validJsonScenario))
	if string(validJsonScenario) != latestTestScenario {
		t.Fatalf("validJsonScenario != latestTestScenario")
	fmt.Println("Validate scenario: scenarioVer[1.6.8] == validatorVer[latest]")
	validJsonScenario, status, err = ValidateScenario([]byte(testScenario_v1_6_8), "")
	if validJsonScenario == nil || status != ValidatorStatusValid || err != nil {
		t.Fatalf("validJsonScenario should not be nil")
	if string(validJsonScenario) != latestTestScenario {
		t.Fatalf("validJsonScenario != latestTestScenario")
	}

	fmt.Println("Validate scenario: scenarioVer[1.6.6] < validatorVer[latest]")
	validJsonScenario, status, err = ValidateScenario([]byte(testScenario_v1_6_6), "")
	if validJsonScenario == nil || status != ValidatorStatusUpdated || err != nil {
		t.Fatalf("validJsonScenario should not be nil")
	}
	if string(validJsonScenario) != latestTestScenario {
		t.Fatalf("validJsonScenario != latestTestScenario")
	}

Kevin Di Lallo's avatar
Kevin Di Lallo committed
	fmt.Println("Validate scenario: scenarioVer[1.5.3] < validatorVer[latest]")
	validJsonScenario, status, err = ValidateScenario([]byte(testScenario_v1_5_3), "")
	if validJsonScenario == nil || status != ValidatorStatusUpdated || err != nil {
		t.Fatalf("validJsonScenario should not be nil")
	}
	if string(validJsonScenario) != latestTestScenario {
		t.Fatalf("validJsonScenario != latestTestScenario")
	}

	fmt.Println("Validate scenario: scenarioVer[1.5.0] < validatorVer[latest]")
Simon Pastor's avatar
Simon Pastor committed
	validJsonScenario, status, err = ValidateScenario([]byte(testScenario_v1_5_0), "")
	if validJsonScenario == nil || status != ValidatorStatusUpdated || err != nil {
		t.Fatalf("validJsonScenario should not be nil")
	}
	if string(validJsonScenario) != latestTestScenario {
		t.Fatalf("validJsonScenario != latestTestScenario")
	fmt.Println("Validate scenario: scenarioVer[1.4.0] < validatorVer[latest]")
Simon Pastor's avatar
Simon Pastor committed
	validJsonScenario, status, err = ValidateScenario([]byte(testScenario_v1_4_0), "")
	if validJsonScenario == nil || status != ValidatorStatusUpdated || err != nil {
		t.Fatalf("validJsonScenario should not be nil")
	}
	if string(validJsonScenario) != latestTestScenario {
		t.Fatalf("validJsonScenario != latestTestScenario")
	fmt.Println("Validate scenario: scenarioVer[1.3.0] < validatorVer[latest]")
Simon Pastor's avatar
Simon Pastor committed
	validJsonScenario, status, err = ValidateScenario([]byte(testScenario_v1_3_0), "")
	if validJsonScenario == nil || status != ValidatorStatusUpdated || err != nil {
		t.Fatalf("validJsonScenario should not be nil")
	}
	if string(validJsonScenario) != latestTestScenario {
		t.Fatalf("validJsonScenario != latestTestScenario")