func()

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
}