-
Notifications
You must be signed in to change notification settings - Fork 434
/
ovn-nb_global.go
159 lines (129 loc) · 3.87 KB
/
ovn-nb_global.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package ovs
import (
"context"
"fmt"
"reflect"
"strings"
"k8s.io/klog/v2"
"github.com/kubeovn/kube-ovn/pkg/ovsdb/ovnnb"
)
func (c *OVNNbClient) CreateNbGlobal(nbGlobal *ovnnb.NBGlobal) error {
op, err := c.ovsDbClient.Create(nbGlobal)
if err != nil {
return fmt.Errorf("generate operations for creating nb global: %v", err)
}
return c.Transact("nb-global-create", op)
}
func (c *OVNNbClient) DeleteNbGlobal() error {
nbGlobal, err := c.GetNbGlobal()
if err != nil {
klog.Error(err)
return err
}
op, err := c.Where(nbGlobal).Delete()
if err != nil {
klog.Error(err)
return err
}
return c.Transact("nb-global-delete", op)
}
func (c *OVNNbClient) GetNbGlobal() (*ovnnb.NBGlobal, error) {
ctx, cancel := context.WithTimeout(context.Background(), c.Timeout)
defer cancel()
nbGlobalList := make([]ovnnb.NBGlobal, 0, 1)
// there is only one nb_global in OVN_Northbound, so return true and it will work
err := c.WhereCache(func(_ *ovnnb.NBGlobal) bool {
return true
}).List(ctx, &nbGlobalList)
if err != nil {
klog.Error(err)
return nil, fmt.Errorf("list nbGlobal: %v", err)
}
if len(nbGlobalList) == 0 {
return nil, fmt.Errorf("not found nb_global")
}
return &nbGlobalList[0], nil
}
func (c *OVNNbClient) UpdateNbGlobal(nbGlobal *ovnnb.NBGlobal, fields ...interface{}) error {
op, err := c.Where(nbGlobal).Update(nbGlobal, fields...)
if err != nil {
return fmt.Errorf("generate operations for updating nb global: %v", err)
}
if err := c.Transact("nb-global-update", op); err != nil {
return fmt.Errorf("update nb global: %v", err)
}
return nil
}
func (c *OVNNbClient) SetAzName(azName string) error {
nbGlobal, err := c.GetNbGlobal()
if err != nil {
return fmt.Errorf("get nb global: %v", err)
}
if azName == nbGlobal.Name {
return nil // no need to update
}
nbGlobal.Name = azName
if err := c.UpdateNbGlobal(nbGlobal, &nbGlobal.Name); err != nil {
return fmt.Errorf("set nb_global az name %s: %v", azName, err)
}
return nil
}
func (c *OVNNbClient) SetNbGlobalOptions(key string, value interface{}) error {
nbGlobal, err := c.GetNbGlobal()
if err != nil {
return fmt.Errorf("failed to get nb global: %v", err)
}
v := fmt.Sprintf("%v", value)
if len(nbGlobal.Options) != 0 && nbGlobal.Options[key] == v {
return nil
}
options := make(map[string]string, len(nbGlobal.Options)+1)
for k, v := range nbGlobal.Options {
options[k] = v
}
nbGlobal.Options[key] = v
if err := c.UpdateNbGlobal(nbGlobal, &nbGlobal.Options); err != nil {
return fmt.Errorf("failed to set nb global option %s to %v: %v", key, value, err)
}
return nil
}
func (c *OVNNbClient) SetUseCtInvMatch() error {
return c.SetNbGlobalOptions("use_ct_inv_match", false)
}
func (c *OVNNbClient) SetICAutoRoute(enable bool, blackList []string) error {
nbGlobal, err := c.GetNbGlobal()
if err != nil {
return fmt.Errorf("get nb global: %v", err)
}
options := make(map[string]string, len(nbGlobal.Options)+3)
for k, v := range nbGlobal.Options {
options[k] = v
}
if enable {
options["ic-route-adv"] = "true"
options["ic-route-learn"] = "true"
options["ic-route-blacklist"] = strings.Join(blackList, ",")
} else {
delete(options, "ic-route-adv")
delete(options, "ic-route-learn")
delete(options, "ic-route-blacklist")
}
if reflect.DeepEqual(options, nbGlobal.Options) {
nbGlobal.Options = options
return nil
}
nbGlobal.Options = options
if err := c.UpdateNbGlobal(nbGlobal, &nbGlobal.Options); err != nil {
return fmt.Errorf("enable ovn-ic auto route, %v", err)
}
return nil
}
func (c *OVNNbClient) SetLBCIDR(serviceCIDR string) error {
return c.SetNbGlobalOptions("svc_ipv4_cidr", serviceCIDR)
}
func (c *OVNNbClient) SetLsDnatModDlDst(enabled bool) error {
return c.SetNbGlobalOptions("ls_dnat_mod_dl_dst", enabled)
}
func (c *OVNNbClient) SetLsCtSkipDstLportIPs(enabled bool) error {
return c.SetNbGlobalOptions("ls_ct_skip_dst_lport_ips", enabled)
}