Clean up netns symlink of failure
* change the netns symlink name to pod full name (concating the namespace and name) * clean up the symlink on failure Change-Id: Ic80b07e2e3b6c3a312d95af4068e69f4740e44eb Closes-Bug: 1712273 Signed-off-by: Pengfei Ni <feiskyer@gmail.com>
This commit is contained in:
parent
b828e3d7ab
commit
7e2fc21c2c
@ -145,7 +145,7 @@ func initOpenstack(stdinData []byte) (OpenStack, string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func cmdAdd(args *skel.CmdArgs) error {
|
func cmdAdd(args *skel.CmdArgs) error {
|
||||||
os, cniVersion, err := initOpenstack(args.StdinData)
|
osClient, cniVersion, err := initOpenstack(args.StdinData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Init OpenStack failed: %v", err)
|
glog.Errorf("Init OpenStack failed: %v", err)
|
||||||
return err
|
return err
|
||||||
@ -159,14 +159,14 @@ func cmdAdd(args *skel.CmdArgs) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get tenantID
|
// Get tenantID
|
||||||
tenantID, err := os.Client.GetTenantIDFromName(podNamespace)
|
tenantID, err := osClient.Client.GetTenantIDFromName(podNamespace)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Get tenantID failed: %v", err)
|
glog.Errorf("Get tenantID failed: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get networkID
|
// Get networkID
|
||||||
networkID, err := os.getNetworkIDByNamespace(podNamespace)
|
networkID, err := osClient.getNetworkIDByNamespace(podNamespace)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Get networkID failed: %v", err)
|
glog.Errorf("Get networkID failed: %v", err)
|
||||||
return err
|
return err
|
||||||
@ -174,12 +174,13 @@ func cmdAdd(args *skel.CmdArgs) error {
|
|||||||
|
|
||||||
// Build port name
|
// Build port name
|
||||||
portName := util.BuildPortName(podNamespace, podName)
|
portName := util.BuildPortName(podNamespace, podName)
|
||||||
|
podFullName := util.BuildFullPodName(podNamespace, podName)
|
||||||
|
|
||||||
// Get port from openstack.
|
// Get port from openstack.
|
||||||
port, err := os.Client.GetPort(portName)
|
port, err := osClient.Client.GetPort(portName)
|
||||||
if err == util.ErrNotFound || port == nil {
|
if err == util.ErrNotFound || port == nil {
|
||||||
// Port not found, create a new one.
|
// Port not found, create a new one.
|
||||||
portWithBinding, err := os.Client.CreatePort(networkID, tenantID, portName)
|
portWithBinding, err := osClient.Client.CreatePort(networkID, tenantID, portName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("CreatePort failed: %v", err)
|
glog.Errorf("CreatePort failed: %v", err)
|
||||||
return err
|
return err
|
||||||
@ -189,14 +190,18 @@ func cmdAdd(args *skel.CmdArgs) error {
|
|||||||
glog.Errorf("GetPort failed: %v", err)
|
glog.Errorf("GetPort failed: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
if osClient.Client.DeletePortByID(port.ID) != nil {
|
||||||
|
glog.Warningf("Delete port %s failed", port.ID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
deviceOwner := fmt.Sprintf("compute:%s", getHostName())
|
deviceOwner := fmt.Sprintf("compute:%s", getHostName())
|
||||||
if port.DeviceOwner != deviceOwner {
|
if port.DeviceOwner != deviceOwner {
|
||||||
err := os.Client.UpdatePortsBinding(port.ID, deviceOwner)
|
err := osClient.Client.UpdatePortsBinding(port.ID, deviceOwner)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if os.Client.DeletePortByID(port.ID) != nil {
|
|
||||||
glog.Warningf("Delete port %s failed", port.ID)
|
|
||||||
}
|
|
||||||
glog.Errorf("Update port %s failed: %v", portName, err)
|
glog.Errorf("Update port %s failed: %v", portName, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -204,12 +209,9 @@ func cmdAdd(args *skel.CmdArgs) error {
|
|||||||
glog.V(4).Infof("Pod %s's port is %v", podName, port)
|
glog.V(4).Infof("Pod %s's port is %v", podName, port)
|
||||||
|
|
||||||
// Get subnet and gateway
|
// Get subnet and gateway
|
||||||
subnet, err := os.Client.GetProviderSubnet(port.FixedIPs[0].SubnetID)
|
subnet, err := osClient.Client.GetProviderSubnet(port.FixedIPs[0].SubnetID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Get info of subnet %s failed: %v", port.FixedIPs[0].SubnetID, err)
|
glog.Errorf("Get info of subnet %s failed: %v", port.FixedIPs[0].SubnetID, err)
|
||||||
if os.Client.DeletePortByID(port.ID) != nil {
|
|
||||||
glog.Warningf("Delete port %s failed", port.ID)
|
|
||||||
}
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,21 +230,28 @@ func cmdAdd(args *skel.CmdArgs) error {
|
|||||||
// container runtime has already made the symlink for netns.
|
// container runtime has already made the symlink for netns.
|
||||||
netnsName = path.Base(netns.Path())
|
netnsName = path.Base(netns.Path())
|
||||||
} else {
|
} else {
|
||||||
netnsName = podName
|
netnsName = podFullName
|
||||||
destPath := filepath.Join(netnsBasePath, netnsName)
|
destPath := filepath.Join(netnsBasePath, netnsName)
|
||||||
if err := util.NetnsSymlink(netns.Path(), destPath); err != nil {
|
if err := util.NetnsSymlink(netns.Path(), destPath); err != nil {
|
||||||
return fmt.Errorf("error of symlink %q: %v", destPath, err)
|
return fmt.Errorf("error of symlink %q: %v", destPath, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
if _, err := os.Stat(destPath); !os.IsNotExist(err) {
|
||||||
|
if err = os.Remove(destPath); err != nil && !os.IsNotExist(err) {
|
||||||
|
glog.Warningf("Failed to remove netns symlink %q: %v", destPath, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
brInterface, conInterface, err := os.Plugin.SetupInterface(portName, args.ContainerID, port,
|
brInterface, conInterface, err := osClient.Plugin.SetupInterface(portName, args.ContainerID, port,
|
||||||
fmt.Sprintf("%s/%d", port.FixedIPs[0].IPAddress, prefixSize),
|
fmt.Sprintf("%s/%d", port.FixedIPs[0].IPAddress, prefixSize),
|
||||||
subnet.Gateway, args.IfName, netnsName)
|
subnet.Gateway, args.IfName, netnsName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("SetupInterface failed: %v", err)
|
glog.Errorf("SetupInterface failed: %v", err)
|
||||||
if os.Client.DeletePortByID(port.ID) != nil {
|
|
||||||
glog.Warningf("Delete port %s failed", port.ID)
|
|
||||||
}
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -288,6 +297,7 @@ func cmdDel(args *skel.CmdArgs) error {
|
|||||||
|
|
||||||
// Build port name
|
// Build port name
|
||||||
portName := util.BuildPortName(podNamespace, podName)
|
portName := util.BuildPortName(podNamespace, podName)
|
||||||
|
podFullName := util.BuildFullPodName(podNamespace, podName)
|
||||||
|
|
||||||
// Get port from openstack
|
// Get port from openstack
|
||||||
port, err := osClient.Client.GetPort(portName)
|
port, err := osClient.Client.GetPort(portName)
|
||||||
@ -323,7 +333,7 @@ func cmdDel(args *skel.CmdArgs) error {
|
|||||||
}
|
}
|
||||||
defer netns.Close()
|
defer netns.Close()
|
||||||
if !strings.HasPrefix(netnsBasePath, netns.Path()) {
|
if !strings.HasPrefix(netnsBasePath, netns.Path()) {
|
||||||
destPath := filepath.Join(netnsBasePath, podName)
|
destPath := filepath.Join(netnsBasePath, podFullName)
|
||||||
if _, err := os.Stat(destPath); !os.IsNotExist(err) {
|
if _, err := os.Stat(destPath); !os.IsNotExist(err) {
|
||||||
if err = os.Remove(destPath); err != nil {
|
if err = os.Remove(destPath); err != nil {
|
||||||
glog.Warningf("failed to remove %q: %v", destPath, err)
|
glog.Warningf("failed to remove %q: %v", destPath, err)
|
||||||
|
@ -21,6 +21,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
|
"fmt"
|
||||||
apiv1 "k8s.io/api/core/v1"
|
apiv1 "k8s.io/api/core/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -58,6 +59,10 @@ func BuildPortName(namespace, podName string) string {
|
|||||||
return namePrefix + "-" + namespace + "-" + podName
|
return namePrefix + "-" + namespace + "-" + podName
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BuildFullPodName(namespace, name string) string {
|
||||||
|
return fmt.Sprintf("%s-%s", namespace, name)
|
||||||
|
}
|
||||||
|
|
||||||
func IsSystemNamespace(ns string) bool {
|
func IsSystemNamespace(ns string) bool {
|
||||||
switch ns {
|
switch ns {
|
||||||
case
|
case
|
||||||
|
Loading…
Reference in New Issue
Block a user