/// <summary> /// Overrides this value with another field by field, where '*' represents the base value, i.e. /// if address is "123.12" gets overridden by address "*.2", then result will be "123.12.2". Same rule applies field-by-field for address,port and group /// </summary> /// <param name="other">Another peer to override this one with</param> /// <returns>New peer with field-by-field overridden data</returns> public NetSvcPeer Override(NetSvcPeer other) { if (other.Blank) { return(this); } var addr = Address; var port = Port; var group = Group; if (other.Address.IsNotNullOrWhiteSpace()) { addr = other.Address.Replace(BASE_MATCH, addr).Trim(); } if (other.Port.IsNotNullOrWhiteSpace()) { port = other.Port.Replace(BASE_MATCH, port).Trim(); } if (other.Group.IsNotNullOrWhiteSpace()) { group = other.Group.Replace(BASE_MATCH, group).Trim(); } return(new NetSvcPeer(addr, port, group)); }
private NetSvcPeer resolveDynamicHostAddress(string fullHostName, string net, string svc, SectionHost fromh, SectionHost toh, NetSvcPeer toPeer) { Contracts.HostInfo hinfo = null; SectionZone zone = toh.ParentZone; while (zone != null) { var hzgovs = zone.ZoneGovernorHosts.Where(h => !h.Dynamic);//Where for safeguard check, as dynamic host can not be zonegov, but in case someone ignores AMM error foreach (var hzgov in hzgovs) { try { using (var cl = Contracts.ServiceClientHub.New <Contracts.IZoneHostRegistryClient>(hzgov)) { cl.TimeoutMs = this.m_ResolveDynamicHostNetSvcTimeoutMs; hinfo = cl.GetSubordinateHost(fullHostName); break; } } catch (Exception error) { //todo Perf counter log(MessageType.Error, "resolveDynamicHostAddress()", "Error resolving net svc on dynamic host '{0}' while contacting zgov on '{1}': {2}".Args(fullHostName, hzgov.RegionPath, error.ToMessageWithType()), error); } } //foreach zone = zone.ParentZone; //loop only WITHIN the NOC } //while if (hinfo == null) { throw new MetabaseException(StringConsts.METABASE_NET_SVC_RESOLVER_DYN_HOST_UNKNOWN_ERROR.Args(svc, fromh.RegionPath, toh.RegionPath, net)); } var pattern = toPeer.Address + "*"; foreach (var nic in hinfo.NetInfo.Adapters) { foreach (var addr in nic.Addresses.Where(a => a.Unicast)) { if (NFX.Parsing.Utils.MatchPattern(addr.Name, pattern)) { return(new NetSvcPeer(addr.Name, toPeer.Port, toPeer.Group)); } } } throw new MetabaseException(StringConsts.METABASE_NET_SVC_RESOLVER_DYN_HOST_NO_ADDR_MATCH_ERROR.Args(svc, fromh.RegionPath, toh.RegionPath, net, toPeer.Address)); }
private string resolveNetworkServiceToConnectString(string host, string net, string svc, string binding = null, string fromHost = null) { if (host.IsNullOrWhiteSpace() || net.IsNullOrWhiteSpace() || svc.IsNullOrWhiteSpace()) { throw new MetabaseException(StringConsts.ARGUMENT_ERROR + "Metabase.ResolveNetSvc(host|net|svc==null|empty)"); } if (fromHost.IsNullOrWhiteSpace()) { fromHost = AgniSystem.HostName; } if (fromHost.IsNullOrWhiteSpace()) { throw new MetabaseException(StringConsts.ARGUMENT_ERROR + "Metabase.ResolveNetSvc(fromHost==null|empty & AgniSystem is not avail)"); } var sb = new StringBuilder(); sb.Append(host); sb.Append(';'); sb.Append(net); sb.Append(';'); sb.Append(svc); sb.Append(';'); sb.Append(binding.IsNullOrWhiteSpace() ? SysConsts.NULL : binding); sb.Append(';'); sb.Append(fromHost); var cacheKey = sb.ToString(); string result = null; if (m_NetResolverCache.TryGetValue(cacheKey, out result)) { return(result); } var bindingNode = GetNetworkSvcBindingConfNode(net, svc, binding); binding = bindingNode.Name; var dfltAddress = bindingNode.AttrByName(CONFIG_ADDRESS_ATTR).Value; var dfltPort = bindingNode.AttrByName(CONFIG_PORT_ATTR).Value; var fromh = CatalogReg.NavigateHost(fromHost); var toh = CatalogReg.NavigateHost(host); var scope = GetNetworkScope(net); var nsvc = GetNetworkSvcConfNode(net, svc); if (scope == NetworkScope.NOC || scope == NetworkScope.NOCGroup) { if (!fromh.NOC.IsLogicallyTheSame(toh.NOC)) { throw new MetabaseException(StringConsts.METABASE_NET_SVC_RESOLVER_TARGET_NOC_INACCESSIBLE_ERROR.Args(svc, fromh.RegionPath, toh.RegionPath, net, scope)); } } var toPeer = new NetSvcPeer(dfltAddress, dfltPort, null); foreach (var segment in toh.SectionsOnPath) { var level = segment.MatchNetworkRoute(net, svc, binding, fromh.RegionPath); toPeer = toPeer.Override(level); } if (scope == NetworkScope.Group || scope == NetworkScope.NOCGroup) { if (toPeer.Group.IsNotNullOrWhiteSpace()) { var fromPeer = new NetSvcPeer(dfltAddress, dfltPort, null); foreach (var segment in fromh.SectionsOnPath) { var level = segment.MatchNetworkRoute(net, svc, binding, fromh.RegionPath); fromPeer = fromPeer.Override(level); } if (!INVSTRCMP.Equals(fromPeer.Group, toPeer.Group)) { throw new MetabaseException(StringConsts.METABASE_NET_SVC_RESOLVER_TARGET_GROUP_INACCESSIBLE_ERROR.Args(svc, fromh.RegionPath, toh.RegionPath, net, scope)); } } } if (toh.Dynamic) { var dynPeer = resolveDynamicHostAddress(host, net, svc, fromh, toh, toPeer); result = "{0}://{1}:{2}".Args(binding, dynPeer.Address, dynPeer.Port); //TODO no cache for dynamic host? or use cahce_Put... } else { result = "{0}://{1}:{2}".Args(binding, toPeer.Address, toPeer.Port); m_NetResolverCache.TryAdd(cacheKey, result);//put in cache ONLY for non-dynamic hosts } return(result); }