mirror of
https://github.com/openfaas/faasd.git
synced 2025-06-08 16:06:47 +00:00
Add test for isCNIResultForPID
Signed-off-by: Alex Ellis (OpenFaaS Ltd) <alexellis2@gmail.com>
This commit is contained in:
parent
19a807c336
commit
eec739b9de
@ -147,33 +147,61 @@ func DeleteCNINetwork(ctx context.Context, cni gocni.CNI, client *containerd.Cli
|
|||||||
return errors.Wrapf(containerErr, "Unable to find container: %s, error: %s", name, containerErr)
|
return errors.Wrapf(containerErr, "Unable to find container: %s, error: %s", name, containerErr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetIPAddress returns the IP address from container based on name and PID
|
// GetIPAddress returns the IP address from container based on container name and PID
|
||||||
func GetIPAddress(name string, PID uint32) (string, error) {
|
func GetIPAddress(container string, PID uint32) (string, error) {
|
||||||
processName := fmt.Sprintf("%s-%d", name, PID)
|
|
||||||
CNIDir := path.Join(CNIDataDir, defaultNetworkName)
|
CNIDir := path.Join(CNIDataDir, defaultNetworkName)
|
||||||
|
|
||||||
files, err := ioutil.ReadDir(CNIDir)
|
files, err := ioutil.ReadDir(CNIDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("failed to read CNI dir for container %s: %v", name, err)
|
return "", fmt.Errorf("failed to read CNI dir for container %s: %v", container, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
f, err := os.Open(filepath.Join(CNIDir, file.Name()))
|
// each fileName is an IP address
|
||||||
|
fileName := file.Name()
|
||||||
|
|
||||||
|
resultsFile := filepath.Join(CNIDir, fileName)
|
||||||
|
found, err := isCNIResultForPID(resultsFile, container, PID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("failed to open CNI IP file for %s/%s: %v", CNIDir, file.Name(), err)
|
return "", err
|
||||||
}
|
}
|
||||||
reader := bufio.NewReader(f)
|
|
||||||
text, _ := reader.ReadString('\n')
|
if found {
|
||||||
if strings.Contains(text, processName) {
|
return fileName, nil
|
||||||
i, _ := reader.ReadString('\n')
|
|
||||||
if strings.Contains(i, defaultIfPrefix) {
|
|
||||||
f.Close()
|
|
||||||
return file.Name(), nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
f.Close()
|
|
||||||
}
|
}
|
||||||
return "", fmt.Errorf("unable to get IP address for container %s", name)
|
|
||||||
|
return "", fmt.Errorf("unable to get IP address for container: %s", container)
|
||||||
|
}
|
||||||
|
|
||||||
|
// isCNIResultForPID confirms if the CNI result file contains the
|
||||||
|
// process name, PID and interface name
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
//
|
||||||
|
// /var/run/cni/openfaas-cni-bridge/10.62.0.2
|
||||||
|
//
|
||||||
|
// nats-621
|
||||||
|
// eth1
|
||||||
|
func isCNIResultForPID(fileName, container string, PID uint32) (bool, error) {
|
||||||
|
found := false
|
||||||
|
|
||||||
|
f, err := os.Open(fileName)
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("failed to open CNI IP file for %s: %v", fileName, err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
reader := bufio.NewReader(f)
|
||||||
|
processLine, _ := reader.ReadString('\n')
|
||||||
|
if strings.Contains(processLine, fmt.Sprintf("%s-%d", container, PID)) {
|
||||||
|
ethNameLine, _ := reader.ReadString('\n')
|
||||||
|
if strings.Contains(ethNameLine, defaultIfPrefix) {
|
||||||
|
found = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return found, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CNIGateway returns the gateway for default subnet
|
// CNIGateway returns the gateway for default subnet
|
||||||
|
63
pkg/cninetwork/cni_network_test.go
Normal file
63
pkg/cninetwork/cni_network_test.go
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
package cninetwork
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_isCNIResultForPID_Found(t *testing.T) {
|
||||||
|
body := `nats-621
|
||||||
|
eth1`
|
||||||
|
fileName := `10.62.0.2`
|
||||||
|
container := "nats"
|
||||||
|
PID := uint32(621)
|
||||||
|
fullPath := filepath.Join(os.TempDir(), fileName)
|
||||||
|
|
||||||
|
err := ioutil.WriteFile(fullPath, []byte(body), 0700)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
os.Remove(fullPath)
|
||||||
|
}()
|
||||||
|
|
||||||
|
got, err := isCNIResultForPID(fullPath, container, PID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
want := true
|
||||||
|
if got != want {
|
||||||
|
t.Fatalf("want %v, but got %v", want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_isCNIResultForPID_NoMatch(t *testing.T) {
|
||||||
|
body := `nats-621
|
||||||
|
eth1`
|
||||||
|
fileName := `10.62.0.3`
|
||||||
|
container := "gateway"
|
||||||
|
PID := uint32(621)
|
||||||
|
fullPath := filepath.Join(os.TempDir(), fileName)
|
||||||
|
|
||||||
|
err := ioutil.WriteFile(fullPath, []byte(body), 0700)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
os.Remove(fullPath)
|
||||||
|
}()
|
||||||
|
|
||||||
|
got, err := isCNIResultForPID(fullPath, container, PID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
want := false
|
||||||
|
if got != want {
|
||||||
|
t.Fatalf("want %v, but got %v", want, got)
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user