reason: update license to Mulan PSL v2 Signed-off-by: taleintervenor <taleintervenor@aliyun.com>
157 lines
4.5 KiB
Go
157 lines
4.5 KiB
Go
// Copyright (c) Huawei Technologies Co., Ltd. 2018-2019. All rights reserved.
|
|
// syscontainer-tools is licensed under the Mulan PSL v2.
|
|
// You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|
// You may obtain a copy of Mulan PSL v2 at:
|
|
// http://license.coscl.org.cn/MulanPSL2
|
|
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
|
|
// PURPOSE.
|
|
// See the Mulan PSL v2 for more details.
|
|
// Description: network config operation
|
|
// Author: zhangwei
|
|
// Create: 2018-01-18
|
|
|
|
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"isula.org/syscontainer-tools/types"
|
|
"path/filepath"
|
|
)
|
|
|
|
var (
|
|
// IsuladToolsDirNetns is syscontainer-tools netns dir
|
|
IsuladToolsDirNetns = filepath.Join(IsuladToolsDir, "netns")
|
|
)
|
|
|
|
const (
|
|
// MaxNicNum is max nic number
|
|
MaxNicNum = 128
|
|
)
|
|
|
|
// FindInterfaceByName will find the full config for nic by name
|
|
func (config *ContainerHookConfig) FindInterfaceByName(nic *types.InterfaceConf) *types.InterfaceConf {
|
|
for _, eNic := range config.NetworkInterfaces {
|
|
if nic.Type != eNic.Type && nic.Type != "" {
|
|
continue
|
|
}
|
|
if nic.CtrNicName == eNic.CtrNicName && (nic.HostNicName == "" || nic.HostNicName == eNic.HostNicName) {
|
|
return eNic
|
|
}
|
|
if nic.HostNicName == eNic.HostNicName && (nic.CtrNicName == "" || nic.CtrNicName == eNic.CtrNicName) {
|
|
return eNic
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetNics will list all nics in config
|
|
func (config *ContainerHookConfig) GetNics(filter *types.InterfaceConf) []*types.InterfaceConf {
|
|
interfaces := make([]*types.InterfaceConf, 0)
|
|
for _, intf := range config.NetworkInterfaces {
|
|
if types.IsSameNic(filter, intf) {
|
|
interfaces = append(interfaces, intf)
|
|
}
|
|
}
|
|
return interfaces
|
|
}
|
|
|
|
// IsConflictInterface will check if the new interface config is conflict with the existing ones.
|
|
func (config *ContainerHookConfig) IsConflictInterface(nic *types.InterfaceConf) error {
|
|
for _, eNic := range config.NetworkInterfaces {
|
|
if err := types.IsConflictNic(nic, eNic); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// IsSameInterface will check if the new interface config is same with the existing ones.
|
|
func (config *ContainerHookConfig) IsSameInterface(nic *types.InterfaceConf) bool {
|
|
for _, eNic := range config.NetworkInterfaces {
|
|
if types.IsSameNic(nic, eNic) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// UpdateNetworkInterface will add network interface to config
|
|
func (config *ContainerHookConfig) UpdateNetworkInterface(nic *types.InterfaceConf, isAdd bool) error {
|
|
if isAdd {
|
|
config.dirty = true
|
|
config.NetworkInterfaces = append(config.NetworkInterfaces, nic)
|
|
return nil
|
|
}
|
|
|
|
for index, eNic := range config.NetworkInterfaces {
|
|
if types.IsSameNic(nic, eNic) {
|
|
config.dirty = true
|
|
config.NetworkInterfaces = append(config.NetworkInterfaces[:index], config.NetworkInterfaces[index+1:]...)
|
|
break
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// IsRouteExist will check if the route is added by syscontainer-tools
|
|
func (config *ContainerHookConfig) IsRouteExist(route *types.Route) bool {
|
|
for _, eRoute := range config.NetworkRoutes {
|
|
if types.IsSameRoute(route, eRoute) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// IsConflictRoute will check if the new route config is conflict with the existing ones.
|
|
func (config *ContainerHookConfig) IsConflictRoute(route *types.Route) error {
|
|
for _, eRoute := range config.NetworkRoutes {
|
|
if err := types.IsConflictRoute(route, eRoute); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetRoutes will get all filterd routes
|
|
func (config *ContainerHookConfig) GetRoutes(filter *types.Route) []*types.Route {
|
|
routes := make([]*types.Route, 0)
|
|
for _, eRoute := range config.NetworkRoutes {
|
|
if types.IsSameRoute(filter, eRoute) {
|
|
routes = append(routes, eRoute)
|
|
}
|
|
}
|
|
|
|
return routes
|
|
}
|
|
|
|
// UpdateNetworkRoutes will add route to config
|
|
func (config *ContainerHookConfig) UpdateNetworkRoutes(route *types.Route, isAdd bool) error {
|
|
if isAdd {
|
|
config.dirty = true
|
|
config.NetworkRoutes = append(config.NetworkRoutes, route)
|
|
return nil
|
|
}
|
|
|
|
for index, eRoute := range config.NetworkRoutes {
|
|
if types.IsSameRoute(route, eRoute) {
|
|
config.dirty = true
|
|
config.NetworkRoutes = append(config.NetworkRoutes[:index], config.NetworkRoutes[index+1:]...)
|
|
break
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// CheckNicNum check nic num reach max limit or not
|
|
func (config *ContainerHookConfig) CheckNicNum() error {
|
|
if len(config.NetworkInterfaces) > MaxNicNum {
|
|
return fmt.Errorf("Nic already reach max limit")
|
|
}
|
|
return nil
|
|
}
|