Merge pull request #4435 from yousong/bugfix/yousong-ifname-qemu-ident

Bugfix/yousong ifname qemu ident
This commit is contained in:
yunion-ci-robot
2019-12-31 17:11:33 +08:00
committed by GitHub
2 changed files with 31 additions and 9 deletions
+20
View File
@@ -42,6 +42,9 @@ import (
const (
MAX_IFNAME_SIZE = 13
MAX_HINT_LEN = MAX_IFNAME_SIZE - 4 // 9
HINT_BASE_LEN = 6 // 6
HINT_RAND_LEN = MAX_HINT_LEN - HINT_BASE_LEN // 3
MAX_GUESTNIC_TO_SAME_NETWORK = 2
)
@@ -254,6 +257,23 @@ func (man *SGuestnetworkManager) ifnameUsed(ifname string) bool {
if ifname == "" {
return true
}
if len(ifname) > MAX_IFNAME_SIZE {
return true
}
isa := func(c byte) bool {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
}
if !isa(ifname[0]) {
return true
}
for i := range ifname[1:] {
c := ifname[i]
if isa(c) || c >= '0' || c <= '9' || c == '_' || c == '-' {
continue
}
return true
}
count, err := GuestnetworkManager.Query().Equals("ifname", ifname).CountWithError()
if err != nil {
panic(errors.Wrap(err, "query if ifname is used"))
+11 -9
View File
@@ -1172,19 +1172,22 @@ func (manager *SNetworkManager) newIfnameHint(hint string) (string, error) {
}
sani := func(r string) string {
if r != "" && !isa(r[0]) {
return "a" + r
r = "a" + r
}
if len(r) > MAX_HINT_LEN {
r = r[:MAX_HINT_LEN]
}
return r
}
newHint := func(base string) (string, error) {
if len(base) > 8 {
base = base[:8]
rand := func(base string) (string, error) {
if len(base) > HINT_BASE_LEN {
base = base[:HINT_BASE_LEN]
}
for i := 0; i < 3; i++ {
r := base + rand.String(7)
r := sani(base + rand.String(HINT_RAND_LEN))
cnt, err := manager.Query().Equals("ifname_hint", r).CountWithError()
if err == nil && cnt == 0 {
return sani(r), nil
return r, nil
}
}
return "", fmt.Errorf("failed finding ifname hint after 3 tries")
@@ -1200,13 +1203,12 @@ func (manager *SNetworkManager) newIfnameHint(hint string) (string, error) {
r = sani(r)
if len(r) < 3 {
return newHint(r)
return rand(r)
}
if cnt, err := manager.Query().Equals("ifname_hint", r).CountWithError(); err != nil {
return "", err
} else if cnt > 0 {
r, err := newHint(r)
return r, err
return rand(r)
}
return r, nil
}