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);