in network/hnswrapper/hnsv2wrapperfake.go [69:176]
func (f Hnsv2wrapperFake) ModifyNetworkSettings(network *hcn.HostComputeNetwork, request *hcn.ModifyNetworkSettingRequest) error {
f.Lock()
defer f.Unlock()
delayHnsCall(f.Delay)
networkCache, ok := f.Cache.networks[network.Name]
if !ok {
return nil
}
switch request.RequestType {
case hcn.RequestTypeAdd:
var setPolSettings hcn.PolicyNetworkRequest
err := json.Unmarshal(request.Settings, &setPolSettings)
if err != nil {
return newErrorFakeHNS(err.Error())
}
for _, setPolSetting := range setPolSettings.Policies {
if setPolSetting.Type == hcn.SetPolicy {
var setpol hcn.SetPolicySetting
err := json.Unmarshal(setPolSetting.Settings, &setpol)
if err != nil {
return newErrorFakeHNS(err.Error())
}
if setpol.Type != hcn.SetPolicyTypeIpSet {
// Check Nested SetPolicy members
// checking for the case of no members in nested policy. iMgrCfg.AddEmptySetToLists is set to false in some tests so it creates a nested policy with no members
if setpol.Values != "" {
members := strings.Split(setpol.Values, ",")
for _, memberID := range members {
_, ok := networkCache.Policies[memberID]
if !ok {
return newErrorFakeHNS(fmt.Sprintf("Member Policy %s not found for hcn.RequestTypeAdd", memberID))
}
}
}
}
networkCache.Policies[setpol.Id] = &setpol
}
}
case hcn.RequestTypeRemove:
var setPolSettings hcn.PolicyNetworkRequest
err := json.Unmarshal(request.Settings, &setPolSettings)
if err != nil {
return newErrorFakeHNS(err.Error())
}
for _, newPolicy := range setPolSettings.Policies {
var setpol hcn.SetPolicySetting
err := json.Unmarshal(newPolicy.Settings, &setpol)
if err != nil {
return newErrorFakeHNS(err.Error())
}
if _, ok := networkCache.Policies[setpol.Id]; !ok {
return newErrorFakeHNS(fmt.Sprintf("[FakeHNS] could not find %s ipset", setpol.Name))
}
if setpol.Type == hcn.SetPolicyTypeIpSet {
// For 1st level sets check if they are being referred by nested sets
for _, cacheSet := range networkCache.Policies {
if cacheSet.Type == hcn.SetPolicyTypeIpSet {
continue
}
if strings.Contains(cacheSet.Values, setpol.Id) {
return newErrorFakeHNS(fmt.Sprintf("Set %s is being referred by another %s set", setpol.Name, cacheSet.Name))
}
}
}
delete(networkCache.Policies, setpol.Id)
}
case hcn.RequestTypeUpdate:
var setPolSettings hcn.PolicyNetworkRequest
err := json.Unmarshal(request.Settings, &setPolSettings)
if err != nil {
return newErrorFakeHNS(err.Error())
}
for _, newPolicy := range setPolSettings.Policies {
var setpol hcn.SetPolicySetting
err := json.Unmarshal(newPolicy.Settings, &setpol)
if err != nil {
return newErrorFakeHNS(err.Error())
}
if _, ok := networkCache.Policies[setpol.Id]; !ok {
return newErrorFakeHNS(fmt.Sprintf("[FakeHNS] could not find %s ipset", setpol.Name))
}
_, ok := networkCache.Policies[setpol.Id]
if !ok {
// Replicating HNS behavior, we will not update non-existent set policy
continue
}
if setpol.Type != hcn.SetPolicyTypeIpSet && setpol.Values != "" {
// Check Nested SetPolicy members
members := strings.Split(setpol.Values, ",")
if setpol.Values != "" {
for _, memberID := range members {
_, ok := networkCache.Policies[memberID]
if !ok {
return newErrorFakeHNS(fmt.Sprintf("Member Policy %s not found for hcn.RequestTypeUpdate", memberID))
}
}
}
}
networkCache.Policies[setpol.Id] = &setpol
}
case hcn.RequestTypeRefresh:
return nil
}
return nil
}