diff --git a/src/Extensions/Abstractions/ExecutionContext/BaseExecutionContext.cs b/src/Extensions/Abstractions/ExecutionContext/BaseExecutionContext.cs index 89e680a1f..126ae8e9d 100644 --- a/src/Extensions/Abstractions/ExecutionContext/BaseExecutionContext.cs +++ b/src/Extensions/Abstractions/ExecutionContext/BaseExecutionContext.cs @@ -3,9 +3,13 @@ using System; using System.Diagnostics; +using System.IO; +using System.Linq; using System.Net; using System.Net.Sockets; using System.Reflection; +using System.Text.RegularExpressions; +using System.Xml.Linq; using Microsoft.Extensions.Hosting; namespace Microsoft.Omex.Extensions.Abstractions.ExecutionContext @@ -25,9 +29,11 @@ public class BaseExecutionContext : IExecutionContext // defined by Service Fabric https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-environment-variables-reference internal const string ServiceNameVariableName = "Fabric_ServiceName"; + internal const string ServicePackageVariableName = "Fabric_ServicePackageName"; internal const string ApplicationNameVariableName = "Fabric_ApplicationName"; internal const string NodeNameVariableName = "Fabric_NodeName"; internal const string NodeIPOrFQDNVariableName = "Fabric_NodeIPOrFQDN"; + internal const string FarbicFolderApplication = "Fabric_Folder_Application"; /// /// Create instance of execution context @@ -36,10 +42,11 @@ public class BaseExecutionContext : IExecutionContext public BaseExecutionContext(IHostEnvironment? hostEnvironment = null) { MachineName = GetMachineName(); - BuildVersion = GetBuildVersion(); + ServicePackageName = GetVariable(ServicePackageVariableName) ?? DefaultEmptyValue; + BuildVersion = GetBuildVersionFromServiceManifest() ?? DefaultEmptyValue; ClusterIpAddress = GetIpAddress(MachineName); - + RegionName = GetVariable(RegionNameVariableName) ?? DefaultEmptyValue; DeploymentSlice = GetVariable(SliceNameVariableName) ?? DefaultEmptyValue; @@ -109,6 +116,9 @@ public BaseExecutionContext(IHostEnvironment? hostEnvironment = null) /// public bool IsPrivateDeployment { get; protected set; } + /// + public string ServicePackageName { get; protected set; } + /// /// Get environment variable value /// @@ -137,6 +147,37 @@ protected static string GetBuildVersion() : DefaultEmptyValue; } + /// + /// Get build version from the current running service's manifest file + /// + /// Build version if found, otherwise null + protected string? GetBuildVersionFromServiceManifest() + { + string? serviceManifestPath = GetServiceManifestPath(); + return serviceManifestPath == null ? null : + XElement.Load(serviceManifestPath).Attribute("Version")?.Value; + } + + + private string? GetServiceManifestPath() + { + string? applicationDir = GetVariable(FarbicFolderApplication); + string? serviceManifestName = ServicePackageName; + + if (applicationDir == null || serviceManifestName == null) + { + return null; + } + string serviceProperName = serviceManifestName.Replace(@"\", @"\\").Replace(".", @"\."); + string regexExp = string.Format(@"(.*{0}.*\.Manifest\..*\.xml)$", serviceProperName); + Regex regex = new(regexExp); + string[] manifests = Directory.GetFiles(applicationDir).Where( + path => regex.IsMatch(path) + ).ToArray(); + + return manifests.Length != 1 ? null : manifests.Single(); + } + /// /// Default empty value /// diff --git a/src/Extensions/Abstractions/ExecutionContext/IExecutionContext.cs b/src/Extensions/Abstractions/ExecutionContext/IExecutionContext.cs index cad66ee27..cf6b6f47a 100644 --- a/src/Extensions/Abstractions/ExecutionContext/IExecutionContext.cs +++ b/src/Extensions/Abstractions/ExecutionContext/IExecutionContext.cs @@ -67,5 +67,10 @@ public interface IExecutionContext /// The service name /// string ServiceName { get; } + + /// + /// The service package name + /// + string ServicePackageName { get; } } } diff --git a/src/Extensions/Abstractions/Microsoft.Omex.Extensions.Abstractions.csproj b/src/Extensions/Abstractions/Microsoft.Omex.Extensions.Abstractions.csproj index 7651e0f42..9056dff1b 100644 --- a/src/Extensions/Abstractions/Microsoft.Omex.Extensions.Abstractions.csproj +++ b/src/Extensions/Abstractions/Microsoft.Omex.Extensions.Abstractions.csproj @@ -6,6 +6,7 @@ + diff --git a/tests/Extensions/Abstractions.UnitTests/ExecutionContext/BaseExecutionContextTests.cs b/tests/Extensions/Abstractions.UnitTests/ExecutionContext/BaseExecutionContextTests.cs index 35b54aabb..61e0f83b5 100644 --- a/tests/Extensions/Abstractions.UnitTests/ExecutionContext/BaseExecutionContextTests.cs +++ b/tests/Extensions/Abstractions.UnitTests/ExecutionContext/BaseExecutionContextTests.cs @@ -24,9 +24,12 @@ public void Constructor_InitializesPropertiesProperly(string enviroment, bool is string applicationName = "SomeApplicationName"; string serviceName = "SomeServiceName"; string nodeName = "SomeNodeName"; + string packageName = "SomePackageName"; + IPAddress nodeIPOrFQDN = IPAddress.Parse("192.0.0.1"); Environment.SetEnvironmentVariable(BaseExecutionContext.ClusterNameVariableName, clusterName); + Environment.SetEnvironmentVariable(BaseExecutionContext.ServicePackageVariableName, packageName); Environment.SetEnvironmentVariable(BaseExecutionContext.RegionNameVariableName, regionName); Environment.SetEnvironmentVariable(BaseExecutionContext.SliceNameVariableName, sliceName); Environment.SetEnvironmentVariable(BaseExecutionContext.ApplicationNameVariableName, applicationName); @@ -42,6 +45,7 @@ public void Constructor_InitializesPropertiesProperly(string enviroment, bool is Assert.AreEqual(clusterName, info.Cluster); Assert.AreEqual(regionName, info.RegionName); Assert.AreEqual(sliceName, info.DeploymentSlice); + Assert.AreEqual(packageName, info.ServicePackageName); Assert.AreEqual(enviroment, info.EnvironmentName); Assert.AreEqual(isPrivate, info.IsPrivateDeployment);