Skip to content

Commit

Permalink
Set more properties in default ExectuionContext (#305)
Browse files Browse the repository at this point in the history
* Move more thing to base context
  • Loading branch information
AndreyTretyak authored Feb 12, 2021
1 parent 8d9244c commit aafa073
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 52 deletions.
2 changes: 1 addition & 1 deletion NuGet.Config
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="dependencyVersion" value="Highest" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,23 @@ public class BaseExecutionContext : IExecutionContext
internal const string SliceNameVariableName = "SLICE_NAME";
internal const string EnviromentVariableName = "DOTNET_ENVIRONMENT"; // getting environment directly only if we don't have IHostEnvironment ex. InitializationLogger

// 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 ApplicationNameVariableName = "Fabric_ApplicationName";
internal const string NodeNameVariableName = "Fabric_NodeName";
internal const string NodeIPOrFQDNVariableName = "Fabric_NodeIPOrFQDN";

/// <summary>
/// Create instance of execution context
/// Inherit from this class to populate defined properties with proper values
/// </summary>
public BaseExecutionContext(IHostEnvironment? hostEnvironment = null)
{
MachineName = GetMachineName();
MachineId = MachineName;
ApplicationName = DefaultEmptyValue;
ServiceName = DefaultEmptyValue;
BuildVersion = GetBuildVersion();

ClusterIpAddress = GetIpAddress(MachineName);
Cluster = Cluster = GetVariable(ClusterNameVariableName) ?? DefaultEmptyValue;

RegionName = GetVariable(RegionNameVariableName) ?? DefaultEmptyValue;
DeploymentSlice = GetVariable(SliceNameVariableName) ?? DefaultEmptyValue;

Expand All @@ -52,6 +55,22 @@ public BaseExecutionContext(IHostEnvironment? hostEnvironment = null)
}

IsCanary = false;

// Service Fabric specific values
ServiceName = GetVariable(ServiceNameVariableName) ?? DefaultEmptyValue;
ApplicationName = GetVariable(ApplicationNameVariableName) ?? DefaultEmptyValue;

string nodeName = GetVariable(NodeNameVariableName) ?? DefaultEmptyValue;
MachineId = FormattableString.Invariant($"{MachineName}_{nodeName}");

string? nodeIPAddressOrFQDN = GetVariable(NodeIPOrFQDNVariableName);

if (IPAddress.TryParse(nodeIPAddressOrFQDN, out IPAddress? ipAddress))
{
ClusterIpAddress = ipAddress;
}

Cluster = GetVariable(ClusterNameVariableName) ?? nodeIPAddressOrFQDN ?? MachineId;
}

/// <inheritdoc/>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,48 +1,19 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.

using System;
using System.Fabric;
using System.Net;
using Microsoft.Extensions.Hosting;
using Microsoft.Omex.Extensions.Abstractions;
using Microsoft.Omex.Extensions.Abstractions.Accessors;
using Microsoft.Omex.Extensions.Abstractions.ExecutionContext;

namespace Microsoft.Omex.Extensions.Hosting.Services
{
// TODO: should be removed after our services will set service executable version properly
internal sealed class ServiceFabricExecutionContext : BaseExecutionContext
{
// defined by SF https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-environment-variables-reference
internal const string ServiceNameVariableName = "Fabric_ServiceName";
internal const string ApplicationNameVariableName = "Fabric_ApplicationName";
internal const string NodeNameVariableName = "Fabric_NodeName";
internal const string NodeIPOrFQDNVariableName = "Fabric_NodeIPOrFQDN";

public ServiceFabricExecutionContext(IHostEnvironment hostEnvironment, IAccessor<ServiceContext> accessor)
: base(hostEnvironment)
{
ServiceName = GetVariable(ServiceNameVariableName) ?? DefaultEmptyValue;
ApplicationName = GetVariable(ApplicationNameVariableName) ?? DefaultEmptyValue;

string nodeName = GetVariable(NodeNameVariableName) ?? DefaultEmptyValue;
MachineId = FormattableString.Invariant($"{MachineName}_{nodeName}");

string? nodeIPAddressOrFQDN = GetVariable(NodeIPOrFQDNVariableName);

if (IPAddress.TryParse(nodeIPAddressOrFQDN, out IPAddress? ipAddress))
{
ClusterIpAddress = ipAddress;
}

if (Cluster == DefaultEmptyValue)
{
Cluster = nodeIPAddressOrFQDN ?? MachineId;
}

// TODO: should be removed after our services will set service executable version properly
accessor.OnFirstSet(UpdateState);
}
: base(hostEnvironment) =>
accessor.OnFirstSet(UpdateState);

private void UpdateState(ServiceContext context) =>
BuildVersion = context.CodePackageActivationContext.CodePackageVersion;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the MIT license.

using System;
using System.Net;
using Microsoft.Extensions.Hosting;
using Microsoft.Omex.Extensions.Abstractions.ExecutionContext;
using Microsoft.VisualStudio.TestTools.UnitTesting;
Expand All @@ -20,10 +21,18 @@ public void Constructor_InitializesPropertiesProperly(string enviroment, bool is
string clusterName = "SomeClusterName";
string regionName = "SomeRegionName";
string sliceName = "SomeSliceName";
string applicationName = "SomeApplicationName";
string serviceName = "SomeServiceName";
string nodeName = "SomeNodeName";
IPAddress nodeIPOrFQDN = IPAddress.Parse("192.0.0.1");

Environment.SetEnvironmentVariable(BaseExecutionContext.ClusterNameVariableName, clusterName);
Environment.SetEnvironmentVariable(BaseExecutionContext.RegionNameVariableName, regionName);
Environment.SetEnvironmentVariable(BaseExecutionContext.SliceNameVariableName, sliceName);
Environment.SetEnvironmentVariable(BaseExecutionContext.ApplicationNameVariableName, applicationName);
Environment.SetEnvironmentVariable(BaseExecutionContext.ServiceNameVariableName, serviceName);
Environment.SetEnvironmentVariable(BaseExecutionContext.NodeNameVariableName, nodeName);
Environment.SetEnvironmentVariable(BaseExecutionContext.NodeIPOrFQDNVariableName, nodeIPOrFQDN.ToString());

Mock<IHostEnvironment> enviromentMock = new Mock<IHostEnvironment>();
enviromentMock.SetupGet(e => e.EnvironmentName).Returns(enviroment);
Expand All @@ -36,6 +45,11 @@ public void Constructor_InitializesPropertiesProperly(string enviroment, bool is

Assert.AreEqual(enviroment, info.EnvironmentName);
Assert.AreEqual(isPrivate, info.IsPrivateDeployment);

Assert.AreEqual(applicationName, info.ApplicationName);
Assert.AreEqual(serviceName, info.ServiceName);
StringAssert.Contains(info.MachineId, nodeName);
Assert.AreEqual(nodeIPOrFQDN, info.ClusterIpAddress);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

using System;
using System.Fabric;
using System.Net;
using Microsoft.Extensions.Hosting;
using Microsoft.Omex.Extensions.Abstractions.Accessors;
using Microsoft.Omex.Extensions.Abstractions.ExecutionContext;
Expand All @@ -19,26 +18,12 @@ public class ServiceFabricExecutionContextTests
[TestMethod]
public void Constructor_InitializesPropertiesProperly()
{
string applicationName = "SomeApplicationName";
string serviceName = "SomeServiceName";
string nodeName = "SomeNodeName";
IPAddress nodeIPOrFQDN = IPAddress.Parse("192.0.0.1");

Environment.SetEnvironmentVariable(ServiceFabricExecutionContext.ApplicationNameVariableName, applicationName);
Environment.SetEnvironmentVariable(ServiceFabricExecutionContext.ServiceNameVariableName, serviceName);
Environment.SetEnvironmentVariable(ServiceFabricExecutionContext.NodeNameVariableName, nodeName);
Environment.SetEnvironmentVariable(ServiceFabricExecutionContext.NodeIPOrFQDNVariableName, nodeIPOrFQDN.ToString());

ServiceContext context = MockStatelessServiceContextFactory.Default;
Accessor<ServiceContext> accessor = new Accessor<ServiceContext>();
((IAccessorSetter<ServiceContext>)accessor).SetValue(context);

IExecutionContext info = new ServiceFabricExecutionContext(new Mock<IHostEnvironment>().Object, accessor);

Assert.AreEqual(applicationName, info.ApplicationName);
Assert.AreEqual(serviceName, info.ServiceName);
StringAssert.Contains(info.MachineId, nodeName);
Assert.AreEqual(nodeIPOrFQDN, info.ClusterIpAddress);
Assert.AreEqual(context.CodePackageActivationContext.CodePackageVersion, info.BuildVersion);
}
}
Expand Down

0 comments on commit aafa073

Please sign in to comment.