func CreateNodeTestData(vppCache api.VppCache) error {
	rawData := getRawNodeTestData()
	for node, data := range rawData {
		vn := &vppnodemodel.VppNode{}
		if err := jsonpb.UnmarshalString(data["vppnode"], vn); err != nil {
			return fmt.Errorf("failed to unmarshall vpp node")
		}
		nl := &status.AgentStatus{}
		if err := json.Unmarshal([]byte(data["liveness"]), nl); err != nil {
			return fmt.Errorf("failed to unmarshall node liveness, err %s", err)
		}
		nifc := make(telemetrymodel.NodeInterfaces, 0)
		if err := json.Unmarshal([]byte(data["interfaces"]), &nifc); err != nil {
			return fmt.Errorf("failed to unmarshall node interfaces, err %s", err)
		}
		nbd := make(telemetrymodel.NodeBridgeDomains, 0)
		if err := json.Unmarshal([]byte(data["bridgedomains"]), &nbd); err != nil {
			return fmt.Errorf("failed to unmarshall node interfaces, err %s", err)
		}
		nodel2fib := make(telemetrymodel.NodeL2FibTable, 0)
		if err := json.Unmarshal([]byte(data["l2fib"]), &nodel2fib); err != nil {
			return fmt.Errorf("failed to unmarshall node interfaces, err %s", err)
		}
		narp := make(telemetrymodel.NodeIPArpTable, 0)
		if err := json.Unmarshal([]byte(data["arps"]), &narp); err != nil {
			return fmt.Errorf("failed to unmarshall node interfaces, err %s", err)
		}
		nr := make(telemetrymodel.NodeStaticRoutes, 0)
		if err := json.Unmarshal([]byte(data["routes"]), &nr); err != nil {
			return fmt.Errorf("failed to unmarshall node interfaces, err %s", err)
		}
		nipe := restapi.NodeIPAMInfo{}
		if err := json.Unmarshal([]byte(data["ipam"]), &nipe); err != nil {
			return fmt.Errorf("failed to unmarshall node ipam, err %s", err)
		}
		if node != vn.Name {
			return fmt.Errorf("invalid data - TODO more precise error")
		}
		if err := vppCache.CreateNode(vn.Id, vn.Name, vn.IpAddresses[0]); err != nil {
			return fmt.Errorf("failed to create test data for node %s, err: %s", vn.Name, err)
		}
		if err := vppCache.SetNodeLiveness(vn.Name, nl); err != nil {
			return fmt.Errorf("failed to set liveness for node %s, err: %s", vn.Name, err)
		}
		if err := vppCache.SetNodeInterfaces(vn.Name, nifc); err != nil {
			return fmt.Errorf("failed to set interfaces for node %s, err: %s", vn.Name, err)
		}
		if err := vppCache.SetNodeBridgeDomain(vn.Name, nbd); err != nil {
			return fmt.Errorf("failed to set bridge domains for node %s, err: %s", vn.Name, err)
		}
		if err := vppCache.SetNodeL2Fibs(vn.Name, nodel2fib); err != nil {
			return fmt.Errorf("failed to set l2fib table for node %s, err: %s", vn.Name, err)
		}
		if err := vppCache.SetNodeIPARPs(vn.Name, narp); err != nil {
			return fmt.Errorf("failed to set arp table for node %s, err: %s", vn.Name, err)
		}
		if err := vppCache.SetNodeStaticRoutes(vn.Name, nr); err != nil {
			return fmt.Errorf("failed to set route table for node %s, err: %s", vn.Name, err)
		}
		if err := vppCache.SetNodeIPam(vn.Name, nipe); err != nil {
			return fmt.Errorf("failed to set ipam for node %s, err: %s", vn.Name, err)
		}
	}
	return nil
}
createNodeTestData creates a test vector that roughly corresponds to a 3-node
vagrant topology (1 master, 2 workers). The created topology is defect-free,
i.e. defect must be injected into the topology individually for each test
case.
package testdata
import (
	"encoding/json"
	"fmt"
	"github.com/golang/protobuf/jsonpb"
	"go.ligato.io/cn-infra/v2/health/statuscheck/model/status"
	"github.com/contiv/vpp/plugins/crd/api"
	"github.com/contiv/vpp/plugins/crd/cache/telemetrymodel"
	"github.com/contiv/vpp/plugins/ipnet/restapi"
	nodemodel "github.com/contiv/vpp/plugins/ksr/model/node"
	podmodel "github.com/contiv/vpp/plugins/ksr/model/pod"
	vppnodemodel "github.com/contiv/vpp/plugins/nodesync/vppnode"
)