Skip to content

Commit 0d79c55

Browse files
Copilotsamtrion
andcommitted
Changes before error encountered
Co-authored-by: samtrion <[email protected]>
1 parent 1bc7ff9 commit 0d79c55

File tree

4 files changed

+164
-15
lines changed

4 files changed

+164
-15
lines changed

src/NetEvolve.HealthChecks.Azure.Synapse/ClientCreation.cs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ namespace NetEvolve.HealthChecks.Azure.Synapse;
33
using System;
44
using System.Collections.Concurrent;
55
using System.Diagnostics;
6+
using System.Linq;
67
using global::Azure.Analytics.Synapse.Artifacts;
78
using global::Azure.Identity;
89
using Microsoft.Extensions.DependencyInjection;
@@ -40,12 +41,34 @@ IServiceProvider serviceProvider
4041
var tokenCredential = serviceProvider.GetService<TokenCredential>() ?? new DefaultAzureCredential();
4142
return new ArtifactsClient(options.WorkspaceUri, tokenCredential);
4243
case SynapseClientCreationMode.ConnectionString:
43-
// Note: For connection string mode, we'll need to parse the connection string to extract workspace URI
44+
// For connection string mode, we extract the workspace URI from the connection string
4445
// and use DefaultAzureCredential for authentication
46+
var workspaceUri = ExtractWorkspaceUriFromConnectionString(options.ConnectionString);
4547
var credential = serviceProvider.GetService<TokenCredential>() ?? new DefaultAzureCredential();
46-
return new ArtifactsClient(options.WorkspaceUri, credential);
48+
return new ArtifactsClient(workspaceUri, credential);
4749
default:
4850
throw new UnreachableException($"Invalid client creation mode `{options.Mode}`.");
4951
}
5052
}
53+
54+
private static Uri ExtractWorkspaceUriFromConnectionString(string? connectionString)
55+
{
56+
if (string.IsNullOrWhiteSpace(connectionString))
57+
{
58+
throw new ArgumentException("Connection string cannot be null or empty.", nameof(connectionString));
59+
}
60+
61+
// Simple connection string parsing for Synapse
62+
// Expected format: "Endpoint=https://myworkspace.dev.azuresynapse.net;..."
63+
var parts = connectionString.Split(';', StringSplitOptions.RemoveEmptyEntries);
64+
var endpointPart = parts.FirstOrDefault(p => p.Trim().StartsWith("Endpoint=", StringComparison.OrdinalIgnoreCase));
65+
66+
if (endpointPart is null)
67+
{
68+
throw new ArgumentException("Connection string must contain an 'Endpoint=' parameter.", nameof(connectionString));
69+
}
70+
71+
var endpointValue = endpointPart.Split('=', 2)[1];
72+
return new Uri(endpointValue);
73+
}
5174
}

src/NetEvolve.HealthChecks.Azure.Synapse/SynapseWorkspaceAvailableConfigure.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace NetEvolve.HealthChecks.Azure.Synapse;
22

33
using System;
4+
using System.Linq;
45
using System.Threading;
56
using global::Azure.Analytics.Synapse.Artifacts;
67
using Microsoft.Extensions.Configuration;
@@ -85,6 +86,34 @@ private static ValidateOptionsResult ValidateModeConnectionString(SynapseWorkspa
8586
);
8687
}
8788

89+
// Validate that connection string contains an Endpoint parameter
90+
try
91+
{
92+
var parts = options.ConnectionString.Split(';', StringSplitOptions.RemoveEmptyEntries);
93+
var endpointPart = parts.FirstOrDefault(p => p.Trim().StartsWith("Endpoint=", StringComparison.OrdinalIgnoreCase));
94+
95+
if (endpointPart is null)
96+
{
97+
return Fail(
98+
"The connection string must contain an 'Endpoint=' parameter when using ConnectionString mode."
99+
);
100+
}
101+
102+
var endpointValue = endpointPart.Split('=', 2)[1];
103+
if (!Uri.TryCreate(endpointValue, UriKind.Absolute, out _))
104+
{
105+
return Fail(
106+
"The Endpoint in the connection string must be a valid absolute URI."
107+
);
108+
}
109+
}
110+
catch (Exception)
111+
{
112+
return Fail(
113+
"Invalid connection string format. Expected format: 'Endpoint=https://myworkspace.dev.azuresynapse.net;'"
114+
);
115+
}
116+
88117
return Success;
89118
}
90119

src/NetEvolve.HealthChecks.Azure.Synapse/SynapseWorkspaceAvailableHealthCheck.cs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,22 @@ CancellationToken cancellationToken
2929
var clientCreation = _serviceProvider.GetRequiredService<ClientCreation>();
3030
var artifactsClient = clientCreation.GetArtifactsClient(name, options, _serviceProvider);
3131

32-
// Check workspace availability by trying to get pipeline service
33-
var pipelineTask = Task.FromResult(true); // Simple connectivity check
3432
try
3533
{
36-
// Try to call a simple method to test connectivity
37-
var pipelineService = artifactsClient.Pipeline;
38-
pipelineTask = Task.FromResult(pipelineService is not null);
34+
// Test connectivity by trying to access the LinkedService service
35+
// This is a basic connectivity check to the Synapse workspace
36+
var linkedServiceClient = artifactsClient.LinkedService;
37+
var healthCheckTask = Task.FromResult(linkedServiceClient is not null);
38+
39+
var (isValid, result) = await healthCheckTask
40+
.WithTimeoutAsync(options.Timeout, cancellationToken)
41+
.ConfigureAwait(false);
42+
43+
return HealthCheckState(isValid && result, name);
3944
}
40-
catch
45+
catch (Exception ex)
4146
{
42-
pipelineTask = Task.FromResult(false);
47+
return HealthCheckUnhealthy(failureStatus, name, ex: ex);
4348
}
44-
45-
var (isValid, result) = await pipelineTask
46-
.WithTimeoutAsync(options.Timeout, cancellationToken)
47-
.ConfigureAwait(false);
48-
49-
return HealthCheckState(isValid && result, name);
5049
}
5150
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
namespace NetEvolve.HealthChecks.Tests.Unit.Azure.Synapse;
2+
3+
using System;
4+
using Microsoft.Extensions.Configuration;
5+
using Microsoft.Extensions.DependencyInjection;
6+
using Microsoft.Extensions.Options;
7+
using NetEvolve.Extensions.TUnit;
8+
using NetEvolve.HealthChecks.Azure.Synapse;
9+
10+
[TestGroup($"{nameof(Azure)}.{nameof(Synapse)}")]
11+
public class SynapseWorkspaceAvailableConfigureTests
12+
{
13+
[Test]
14+
public void Validate_WhenArgumentsAreValidForConnectionString_ShouldReturnSuccess()
15+
{
16+
// Arrange
17+
var configuration = new ConfigurationBuilder().Build();
18+
var serviceProvider = new ServiceCollection().BuildServiceProvider();
19+
var configure = new SynapseWorkspaceAvailableConfigure(configuration, serviceProvider);
20+
var options = new SynapseWorkspaceAvailableOptions
21+
{
22+
ConnectionString = "Endpoint=https://myworkspace.dev.azuresynapse.net;",
23+
Mode = SynapseClientCreationMode.ConnectionString,
24+
Timeout = 100
25+
};
26+
27+
// Act
28+
var result = configure.Validate("Test", options);
29+
30+
// Assert
31+
Assert.True(result.Succeeded);
32+
}
33+
34+
[Test]
35+
public void Validate_WhenArgumentsAreValidForDefaultAzureCredentials_ShouldReturnSuccess()
36+
{
37+
// Arrange
38+
var configuration = new ConfigurationBuilder().Build();
39+
var serviceProvider = new ServiceCollection().BuildServiceProvider();
40+
var configure = new SynapseWorkspaceAvailableConfigure(configuration, serviceProvider);
41+
var options = new SynapseWorkspaceAvailableOptions
42+
{
43+
WorkspaceUri = new Uri("https://myworkspace.dev.azuresynapse.net"),
44+
Mode = SynapseClientCreationMode.DefaultAzureCredentials,
45+
Timeout = 100
46+
};
47+
48+
// Act
49+
var result = configure.Validate("Test", options);
50+
51+
// Assert
52+
Assert.True(result.Succeeded);
53+
}
54+
55+
[Test]
56+
public void Validate_WhenConnectionStringIsInvalid_ShouldReturnFailure()
57+
{
58+
// Arrange
59+
var configuration = new ConfigurationBuilder().Build();
60+
var serviceProvider = new ServiceCollection().BuildServiceProvider();
61+
var configure = new SynapseWorkspaceAvailableConfigure(configuration, serviceProvider);
62+
var options = new SynapseWorkspaceAvailableOptions
63+
{
64+
ConnectionString = "InvalidConnectionString",
65+
Mode = SynapseClientCreationMode.ConnectionString,
66+
Timeout = 100
67+
};
68+
69+
// Act
70+
var result = configure.Validate("Test", options);
71+
72+
// Assert
73+
Assert.False(result.Succeeded);
74+
Assert.Contains("Endpoint", result.FailureMessage);
75+
}
76+
77+
[Test]
78+
public void Validate_WhenWorkspaceUriIsNull_ShouldReturnFailure()
79+
{
80+
// Arrange
81+
var configuration = new ConfigurationBuilder().Build();
82+
var serviceProvider = new ServiceCollection().BuildServiceProvider();
83+
var configure = new SynapseWorkspaceAvailableConfigure(configuration, serviceProvider);
84+
var options = new SynapseWorkspaceAvailableOptions
85+
{
86+
WorkspaceUri = null,
87+
Mode = SynapseClientCreationMode.DefaultAzureCredentials,
88+
Timeout = 100
89+
};
90+
91+
// Act
92+
var result = configure.Validate("Test", options);
93+
94+
// Assert
95+
Assert.False(result.Succeeded);
96+
Assert.Contains("workspace uri cannot be null", result.FailureMessage);
97+
}
98+
}

0 commit comments

Comments
 (0)