Skip to content

Commit b860edb

Browse files
authored
Merge pull request #398 from serverlessworkflow/fix-workflow-completed-event-output
Fix `WorkflowCompletedEventV1` by adding a new `output` property
2 parents c44282e + 1200eac commit b860edb

File tree

21 files changed

+81
-28
lines changed

21 files changed

+81
-28
lines changed

src/api/Synapse.Api.Application/Commands/Resources/CreateResourceCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public class CreateResourceCommandHandler(IResourceRepository repository)
7979
/// <inheritdoc/>
8080
public virtual async Task<IOperationResult<IResource>> HandleAsync(CreateResourceCommand command, CancellationToken cancellationToken)
8181
{
82-
if (command.Resource.GetName().Trim().EndsWith('-')) command.Resource.Metadata.Name = $"{command.Resource.GetName().Trim()}{Guid.NewGuid().ToString("N")[..15]}";
82+
if (command.Resource.GetName().Trim().EndsWith('-')) command.Resource.Metadata.Name = $"{command.Resource.GetName().Trim()}{Guid.NewGuid().ToString("N")[..12]}";
8383
var resource = await repository.AddAsync(command.Resource, command.Group, command.Version, command.Plural, command.DryRun, cancellationToken);
8484
return new OperationResult<IResource>((int)HttpStatusCode.Created, resource);
8585
}

src/api/Synapse.Api.Application/Commands/Resources/Generic/CreateResourceCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public class CreateResourceCommandHandler<TResource>(IResourceRepository reposit
4646
/// <inheritdoc/>
4747
public virtual async Task<IOperationResult<TResource>> HandleAsync(CreateResourceCommand<TResource> command, CancellationToken cancellationToken)
4848
{
49-
if (command.Resource.GetName().Trim().EndsWith('-')) command.Resource.Metadata.Name = $"{command.Resource.GetName().Trim()}{Guid.NewGuid().ToString("N")[..15]}";
49+
if (command.Resource.GetName().Trim().EndsWith('-')) command.Resource.Metadata.Name = $"{command.Resource.GetName().Trim()}{Guid.NewGuid().ToString("N")[..12]}";
5050
var resource = await repository.AddAsync(command.Resource, false, cancellationToken).ConfigureAwait(false);
5151
return new OperationResult<TResource>((int)HttpStatusCode.Created, resource);
5252
}

src/core/Synapse.Core.Infrastructure.Containers.Docker/DockerContainerPlatform.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public virtual async Task<IContainer> CreateAsync(ContainerProcessDefinition def
9393
}
9494
var parameters = new CreateContainerParameters()
9595
{
96+
Name = $"{System.Environment.GetEnvironmentVariable(SynapseDefaults.EnvironmentVariables.Runner.Name)}-{definition.Image}-{Guid.NewGuid().ToString("N")[..6].ToLowerInvariant()}",
9697
Image = definition.Image,
9798
Cmd = string.IsNullOrWhiteSpace(definition.Command) ? null : ["/bin/sh", "-c", definition.Command],
9899
Env = definition.Environment?.Select(e => $"{e.Key}={e.Value}").ToList(),

src/core/Synapse.Core.Infrastructure.Containers.Kubernetes/KubernetesContainer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,10 @@ protected virtual async Task WaitForReadyAsync(CancellationToken cancellationTok
107107
/// <inheritdoc/>
108108
public virtual async Task WaitForExitAsync(CancellationToken cancellationToken = default)
109109
{
110-
var response = this.Kubernetes.CoreV1.ListNamespacedPodWithHttpMessagesAsync(this.Pod.Namespace(), fieldSelector: $"metadata.name={Pod.Name()}", cancellationToken: cancellationToken);
110+
var response = this.Kubernetes.CoreV1.ListNamespacedPodWithHttpMessagesAsync(this.Pod.Namespace(), fieldSelector: $"metadata.name={Pod.Name()}", watch: true, cancellationToken: cancellationToken);
111111
await foreach (var (_, item) in response.WatchAsync<V1Pod, V1PodList>(cancellationToken: cancellationToken).ConfigureAwait(false))
112112
{
113-
if (item.Status.Phase != "Succeeded" || item.Status.Phase != "Failed") continue;
113+
if (item.Status.Phase != "Succeeded" && item.Status.Phase != "Failed") continue;
114114
var containerStatus = item.Status.ContainerStatuses.FirstOrDefault();
115115
this.ExitCode = containerStatus?.State.Terminated?.ExitCode ?? -1;
116116
break;

src/core/Synapse.Core.Infrastructure.Containers.Kubernetes/KubernetesContainerPlatform.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,22 @@ public virtual Task<IContainer> CreateAsync(ContainerProcessDefinition definitio
7777
if (this.Kubernetes == null) throw new NullReferenceException("The KubernetesContainerPlatform has not been properly initialized");
7878
var pod = new V1Pod()
7979
{
80+
Metadata = new()
81+
{
82+
NamespaceProperty = $"{System.Environment.GetEnvironmentVariable(SynapseDefaults.EnvironmentVariables.Runner.Namespace)}",
83+
Name = $"{System.Environment.GetEnvironmentVariable(SynapseDefaults.EnvironmentVariables.Runner.Name)}-{definition.Image}-{Guid.NewGuid().ToString("N")[..6].ToLowerInvariant()}"
84+
},
8085
Spec = new()
8186
{
87+
RestartPolicy = "Never",
8288
Containers =
8389
[
84-
new()
90+
new(definition.Image)
8591
{
8692
Image = definition.Image,
8793
ImagePullPolicy = this.Options.ImagePullPolicy,
8894
Command = string.IsNullOrWhiteSpace(definition.Command) ? null : ["/bin/sh", "-c", definition.Command],
89-
Env = definition.Environment?.Select(e => new V1EnvVar(e.Key, e.Value)).ToList(),
90-
RestartPolicy = "Never"
95+
Env = definition.Environment?.Select(e => new V1EnvVar(e.Key, e.Value)).ToList()
9196
}
9297
]
9398
}

src/core/Synapse.Core/Events/Workflows/WorkflowCompletedEventV1.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,10 @@ public record WorkflowCompletedEventV1
3232
[DataMember(Name = "completedAt", Order = 2), JsonPropertyName("completedAt"), JsonPropertyOrder(2), YamlMember(Alias = "completedAt", Order = 2)]
3333
public DateTimeOffset CompletedAt { get; set; } = DateTimeOffset.Now;
3434

35+
/// <summary>
36+
/// Gets/sets the workflow instance's output
37+
/// </summary>
38+
[DataMember(Name = "output", Order = 3), JsonPropertyName("output"), JsonPropertyOrder(3), YamlMember(Alias = "output", Order = 3)]
39+
public object? Output { get; set; }
40+
3541
}

src/core/Synapse.Core/Resources/Document.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public record Document
2323

2424
/// <inheritdoc/>
2525
[DataMember(Name = "id", Order = 1), JsonPropertyName("id"), JsonPropertyOrder(1), YamlMember(Alias = "id", Order = 1)]
26-
public string Id { get; set; } = Guid.NewGuid().ToString("N")[..15];
26+
public string Id { get; set; } = Guid.NewGuid().ToString("N")[..12];
2727

2828
/// <summary>
2929
/// Gets/sets the document's name

src/core/Synapse.Core/Resources/NativeRuntimeConfiguration.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ public record NativeRuntimeConfiguration
2828
/// Gets the default path to the runner executable file
2929
/// </summary>
3030
public const string DefaultExecutable = "Synapse.Runner";
31+
/// <summary>
32+
/// Gets the default path to the directory that contains the secrets made available to runners
33+
/// </summary>
34+
public static readonly string DefaultSecretsDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".synapse", "secrets");
3135

3236
/// <summary>
3337
/// Initializes a new <see cref="NativeRuntimeConfiguration"/>
@@ -47,6 +51,8 @@ public NativeRuntimeConfiguration()
4751
if (!File.Exists(filePath)) throw new FileNotFoundException("The runner executable file does not exist or cannot be found", filePath);
4852
this.Executable = env;
4953
}
54+
env = Environment.GetEnvironmentVariable(SynapseDefaults.EnvironmentVariables.Runtime.Native.SecretsDirectory);
55+
if (!string.IsNullOrWhiteSpace(env)) this.SecretsDirectory = env;
5056
}
5157

5258
/// <summary>
@@ -61,5 +67,10 @@ public NativeRuntimeConfiguration()
6167
[DataMember(Order = 2, Name = "executable"), JsonPropertyOrder(2), JsonPropertyName("executable"), YamlMember(Order = 2, Alias = "executable")]
6268
public virtual string Executable { get; set; } = DefaultExecutable;
6369

70+
/// <summary>
71+
/// Gets/sets the path to the directory that contains the secrets made available to runners
72+
/// </summary>
73+
[DataMember(Order = 3, Name = "secretsDirectory"), JsonPropertyOrder(3), JsonPropertyName("secretsDirectory"), YamlMember(Order = 3, Alias = "secretsDirectory")]
74+
public virtual string SecretsDirectory { get; set; } = DefaultSecretsDirectory;
6475

6576
}

src/core/Synapse.Core/Resources/TaskInstance.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public record TaskInstance
2424
/// Gets the task's id
2525
/// </summary>
2626
[DataMember(Name = "id", Order = 1), JsonPropertyName("id"), JsonPropertyOrder(1), YamlMember(Alias = "id", Order = 1)]
27-
public virtual string Id { get; set; } = Guid.NewGuid().ToString("N")[..15];
27+
public virtual string Id { get; set; } = Guid.NewGuid().ToString("N")[..12];
2828

2929
/// <summary>
3030
/// Gets the task's name, if any

src/core/Synapse.Core/Synapse.Core.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<Copyright>Copyright © 2024-Present The Synapse Authors. All Rights Reserved.</Copyright>
1616
<RepositoryUrl>https://github.com/serverlessworkflow/synapse</RepositoryUrl>
1717
<RepositoryType>git</RepositoryType>
18+
<PackageId>Synapse</PackageId>
1819
<PackageProjectUrl>https://github.com/serverlessworkflow/synapse</PackageProjectUrl>
1920
<PackageTags>synapse core</PackageTags>
2021
<IsPackable>true</IsPackable>

0 commit comments

Comments
 (0)