9 logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
13 var log = logf.Log.WithName("ovn")
15 func parseOvnNetworkObject(ovnnetwork string) ([]map[string]interface{}, error) {
16 var ovnNet []map[string]interface{}
19 return nil, fmt.Errorf("parseOvnNetworkObject:error")
22 if err := json.Unmarshal([]byte(ovnnetwork), &ovnNet); err != nil {
23 return nil, fmt.Errorf("parseOvnNetworkObject: failed to load ovn network err: %v | ovn network: %v", err, ovnnetwork)
29 func setupDistributedRouter(name string) error {
31 // Create a single common distributed router for the cluster.
32 stdout, stderr, err := RunOVNNbctl("--", "--may-exist", "lr-add", name, "--", "set", "logical_router", name, "external_ids:ovn4nfv-cluster-router=yes")
34 log.Error(err, "Failed to create a single common distributed router for the cluster", "stdout", stdout, "stderr", stderr)
37 // Create a logical switch called "ovn4nfv-join" that will be used to connect gateway routers to the distributed router.
38 // The "ovn4nfv-join" will be allocated IP addresses in the range 100.64.1.0/24.
39 stdout, stderr, err = RunOVNNbctl("--may-exist", "ls-add", "ovn4nfv-join")
41 log.Error(err, "Failed to create logical switch called \"ovn4nfv-join\"", "stdout", stdout, "stderr", stderr)
44 // Connect the distributed router to "ovn4nfv-join".
45 routerMac, stderr, err := RunOVNNbctl("--if-exist", "get", "logical_router_port", "rtoj-"+name, "mac")
47 log.Error(err, "Failed to get logical router port rtoj-", "name", name, "stdout", stdout, "stderr", stderr)
51 routerMac = generateMac()
52 stdout, stderr, err = RunOVNNbctl("--", "--may-exist", "lrp-add", name, "rtoj-"+name, routerMac, "100.64.1.1/24", "--", "set", "logical_router_port", "rtoj-"+name, "external_ids:connect_to_ovn4nfvjoin=yes")
54 log.Error(err, "Failed to add logical router port rtoj", "name", name, "stdout", stdout, "stderr", stderr)
58 // Connect the switch "ovn4nfv-join" to the router.
59 stdout, stderr, err = RunOVNNbctl("--", "--may-exist", "lsp-add", "ovn4nfv-join", "jtor-"+name, "--", "set", "logical_switch_port", "jtor-"+name, "type=router", "options:router-port=rtoj-"+name, "addresses="+"\""+routerMac+"\"")
61 log.Error(err, "Failed to add logical switch port to logical router", "stdout", stdout, "stderr", stderr)
67 // generateMac generates mac address.
68 func generateMac() string {
70 newRand := rand.New(rand.NewSource(time.Now().UnixNano()))
71 mac := fmt.Sprintf("%s:%02x:%02x:%02x", prefix, newRand.Intn(255), newRand.Intn(255), newRand.Intn(255))
75 // NextIP returns IP incremented by 1
76 func NextIP(ip net.IP) net.IP {
78 return intToIP(i.Add(i, big.NewInt(1)))
81 func ipToInt(ip net.IP) *big.Int {
82 if v := ip.To4(); v != nil {
83 return big.NewInt(0).SetBytes(v)
85 return big.NewInt(0).SetBytes(ip.To16())
88 func intToIP(i *big.Int) net.IP {
89 return net.IP(i.Bytes())