Skip to content

Commit

Permalink
refactor: separate normal check and ovn specific check
Browse files Browse the repository at this point in the history
  • Loading branch information
oilbeater committed Jan 2, 2020
1 parent fc7673d commit 8e6c3d6
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 114 deletions.
3 changes: 3 additions & 0 deletions pkg/pinger/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ type Configuration struct {
PodName string
PodIP string
ExternalAddress string
NetworkMode string
}

func ParseFlags() (*Configuration, error) {
Expand All @@ -37,6 +38,7 @@ func ParseFlags() (*Configuration, error) {
argMode = pflag.String("mode", "server", "server or job Mode")
argDns = pflag.String("dns", "kubernetes.default", "check dns from pod")
argExternalAddress = pflag.String("external-address", "", "check ping connection to an external address, default empty that will disable external check")
argNetworkMode = pflag.String("network-mode", "kube-ovn", "The cni plugin current cluster used, default: kube-ovn")
)

klogFlags := flag.NewFlagSet("klog", flag.ExitOnError)
Expand Down Expand Up @@ -69,6 +71,7 @@ func ParseFlags() (*Configuration, error) {
NodeName: os.Getenv("NODE_NAME"),
PodName: os.Getenv("POD_NAME"),
ExternalAddress: *argExternalAddress,
NetworkMode: *argNetworkMode,
}
if err := config.initKubeClient(); err != nil {
return nil, err
Expand Down
116 changes: 116 additions & 0 deletions pkg/pinger/ovn.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package pinger

import (
"fmt"
"github.com/alauda/kube-ovn/pkg/util"
"k8s.io/klog"
"os"
"os/exec"
"strings"
)

func checkOvs(config *Configuration) {
output, err := exec.Command("/usr/share/openvswitch/scripts/ovs-ctl", "status").CombinedOutput()
if err != nil {
klog.Errorf("check ovs status failed %v, %s", err, string(output))
SetOvsDownMetrics(config.NodeName)
return
}
klog.Infof("ovs-vswitchd and ovsdb are up")
SetOvsUpMetrics(config.NodeName)
return
}

func checkOvnController(config *Configuration) {
output, err := exec.Command("/usr/share/openvswitch/scripts/ovn-ctl", "status_controller").CombinedOutput()
if err != nil {
klog.Errorf("check ovn_controller status failed %v, %s", err, string(output))
SetOvnControllerDownMetrics(config.NodeName)
return
}
klog.Infof("ovn_controller is up")
SetOvnControllerUpMetrics(config.NodeName)
}

func checkPortBindings(config *Configuration) {
klog.Infof("start to check por binding")
ovsBindings, err := checkOvsBindings()
if err != nil {
return
}

sbBindings, err := checkSBBindings(config)
if err != nil {
return
}
klog.Infof("port in sb is %v", sbBindings)
misMatch := []string{}
for _, port := range ovsBindings {
if !util.IsStringIn(port, sbBindings) {
misMatch = append(misMatch, port)
}
}
if len(misMatch) > 0 {
klog.Errorf("%d port %v not exist in sb-bindings", len(misMatch), misMatch)
inconsistentPortBindingGauge.WithLabelValues(config.NodeName).Set(float64(len(misMatch)))
} else {
klog.Infof("ovs and ovn-sb binding check passed")
inconsistentPortBindingGauge.WithLabelValues(config.NodeName).Set(0)
}
return
}

func checkOvsBindings() ([]string, error) {
output, err := exec.Command("ovs-vsctl", "--no-heading", "--data=bare", "--format=csv", "--columns=external_ids", "find", "interface", "external_ids:iface-id!=\"\"").CombinedOutput()
if err != nil {
klog.Errorf("failed to get ovs interface %v", err)
return nil, err
}
result := make([]string, 0, len(strings.Split(string(output), "\n")))
for _, line := range strings.Split(string(output), "\n") {
result = append(result, strings.TrimPrefix(line, "iface-id="))
}
return result, nil
}

func checkSBBindings(config *Configuration) ([]string, error) {
sbHost := os.Getenv("OVN_SB_SERVICE_HOST")
sbPort := os.Getenv("OVN_SB_SERVICE_PORT")
output, err := exec.Command(
"ovn-sbctl",
fmt.Sprintf("--db=tcp:%s:%s", sbHost, sbPort),
"--format=csv",
"--no-heading",
"--data=bare",
"--columns=_uuid",
"find",
"chassis",
fmt.Sprintf("hostname=%s", config.NodeName)).CombinedOutput()
if err != nil {
klog.Errorf("failed to find chassis %v", err)
return nil, err
}
if len(output) == 0 {
klog.Errorf("chassis for node %s not exist", config.NodeName)
return nil, fmt.Errorf("chassis for node %s not exist", config.NodeName)
}

chassis := strings.TrimSpace(string(output))
klog.Infof("chassis id is %s", chassis)
output, err = exec.Command(
"ovn-sbctl",
fmt.Sprintf("--db=tcp:%s:%s", sbHost, sbPort),
"--format=csv",
"--no-heading",
"--data=bare",
"--columns=logical_port",
"find",
"port_binding",
fmt.Sprintf("chassis=%s", chassis)).CombinedOutput()
if err != nil {
klog.Errorf("failed to list port_binding in ovn-sb %v", err)
return nil, err
}

return strings.Split(string(output), "\n"), nil
}
121 changes: 7 additions & 114 deletions pkg/pinger/ping.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,24 @@ package pinger

import (
"context"
"fmt"
"github.com/alauda/kube-ovn/pkg/util"
goping "github.com/sparrc/go-ping"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/klog"
"math"
"net"
"os"
"os/exec"
"strings"
"time"
)

func StartPinger(config *Configuration) {
for {
checkOvs(config)
checkOvnController(config)
checkPortBindings(config)
checkApiServer(config)
if config.NetworkMode == "kube-ovn" {
checkOvs(config)
checkOvnController(config)
checkPortBindings(config)
}

ping(config)
if config.Mode != "server" {
break
Expand All @@ -32,6 +29,7 @@ func StartPinger(config *Configuration) {
}

func ping(config *Configuration) {
checkApiServer(config)
pingNodes(config)
pingPods(config)
nslookup(config)
Expand Down Expand Up @@ -165,29 +163,6 @@ func nslookup(config *Configuration) {
klog.Infof("resolve dns %s to %v in %.2fms", config.DNS, addrs, float64(elpased)/float64(time.Millisecond))
}

func checkOvs(config *Configuration) {
output, err := exec.Command("/usr/share/openvswitch/scripts/ovs-ctl", "status").CombinedOutput()
if err != nil {
klog.Errorf("check ovs status failed %v, %s", err, string(output))
SetOvsDownMetrics(config.NodeName)
return
}
klog.Infof("ovs-vswitchd and ovsdb are up")
SetOvsUpMetrics(config.NodeName)
return
}

func checkOvnController(config *Configuration) {
output, err := exec.Command("/usr/share/openvswitch/scripts/ovn-ctl", "status_controller").CombinedOutput()
if err != nil {
klog.Errorf("check ovn_controller status failed %v, %s", err, string(output))
SetOvnControllerDownMetrics(config.NodeName)
return
}
klog.Infof("ovn_controller is up")
SetOvnControllerUpMetrics(config.NodeName)
}

func checkApiServer(config *Configuration) {
klog.Infof("start to check apiserver connectivity")
t1 := time.Now()
Expand All @@ -203,85 +178,3 @@ func checkApiServer(config *Configuration) {
return
}

func checkPortBindings(config *Configuration) error {
klog.Infof("start to check por binding")
ovsBindings, err := checkOvsBindings()
if err != nil {
return err
}

sbBindings, err := checkSBBindings(config)
if err != nil {
return err
}
klog.Infof("port in sb is %v", sbBindings)
misMatch := []string{}
for _, port := range ovsBindings {
if !util.IsStringIn(port, sbBindings) {
misMatch = append(misMatch, port)
}
}
if len(misMatch) > 0 {
klog.Errorf("%d port %v not exist in sb-bindings", len(misMatch), misMatch)
inconsistentPortBindingGauge.WithLabelValues(config.NodeName).Set(float64(len(misMatch)))
} else {
klog.Infof("ovs and ovn-sb binding check passed")
inconsistentPortBindingGauge.WithLabelValues(config.NodeName).Set(0)
}
return nil
}

func checkOvsBindings() ([]string, error) {
output, err := exec.Command("ovs-vsctl", "--no-heading", "--data=bare", "--format=csv", "--columns=external_ids", "find", "interface", "external_ids:iface-id!=\"\"").CombinedOutput()
if err != nil {
klog.Errorf("failed to get ovs interface %v", err)
return nil, err
}
result := make([]string, 0, len(strings.Split(string(output), "\n")))
for _, line := range strings.Split(string(output), "\n") {
result = append(result, strings.TrimPrefix(line, "iface-id="))
}
return result, nil
}

func checkSBBindings(config *Configuration) ([]string, error) {
sbHost := os.Getenv("OVN_SB_SERVICE_HOST")
sbPort := os.Getenv("OVN_SB_SERVICE_PORT")
output, err := exec.Command(
"ovn-sbctl",
fmt.Sprintf("--db=tcp:%s:%s", sbHost, sbPort),
"--format=csv",
"--no-heading",
"--data=bare",
"--columns=_uuid",
"find",
"chassis",
fmt.Sprintf("hostname=%s", config.NodeName)).CombinedOutput()
if err != nil {
klog.Errorf("failed to find chassis %v", err)
return nil, err
}
if len(output) == 0 {
klog.Errorf("chassis for node %s not exist", config.NodeName)
return nil, fmt.Errorf("chassis for node %s not exist", config.NodeName)
}

chassis := strings.TrimSpace(string(output))
klog.Infof("chassis id is %s", chassis)
output, err = exec.Command(
"ovn-sbctl",
fmt.Sprintf("--db=tcp:%s:%s", sbHost, sbPort),
"--format=csv",
"--no-heading",
"--data=bare",
"--columns=logical_port",
"find",
"port_binding",
fmt.Sprintf("chassis=%s", chassis)).CombinedOutput()
if err != nil {
klog.Errorf("failed to list port_binding in ovn-sb %v", err)
return nil, err
}

return strings.Split(string(output), "\n"), nil
}

0 comments on commit 8e6c3d6

Please sign in to comment.