From b2b58790dc92f7c736c7dad72c15251bd1271386 Mon Sep 17 00:00:00 2001 From: "alex.stanfield" <13949480+chaptersix@users.noreply.github.com> Date: Fri, 30 Jan 2026 07:14:02 -0600 Subject: [PATCH 1/6] enable the system callback url --- internal/devserver/server.go | 3 +++ internal/temporalcli/commands.workflow_view_test.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/internal/devserver/server.go b/internal/devserver/server.go index 52756e0ae..7606ed0ea 100644 --- a/internal/devserver/server.go +++ b/internal/devserver/server.go @@ -241,7 +241,10 @@ func (s *StartOptions) buildServerOptions() ([]temporal.ServerOption, *slog.Leve dynConf[dynamicconfig.HistoryCacheHostLevelMaxSize.Key()] = 8096 // Up default visibility RPS dynConf[dynamicconfig.FrontendMaxNamespaceVisibilityRPSPerInstance.Key()] = 100 + // Enable the system callback URL for worker targets. // NOTE that the URL scheme is fixed to HTTP since the dev server doesn't support TLS at the time of writing. + // The callback URL template is used as a fallback for external targets. + dynConf[nexusoperations.UseSystemCallbackURL.Key()] = true dynConf[nexusoperations.CallbackURLTemplate.Key()] = fmt.Sprintf( "http://%s:%d/namespaces/{{.NamespaceName}}/nexus/callback", MaybeEscapeIPv6(s.FrontendIP), s.FrontendHTTPPort) dynConf[callbacks.AllowedAddresses.Key()] = []struct { diff --git a/internal/temporalcli/commands.workflow_view_test.go b/internal/temporalcli/commands.workflow_view_test.go index 980d4b632..3ac1b73c9 100644 --- a/internal/temporalcli/commands.workflow_view_test.go +++ b/internal/temporalcli/commands.workflow_view_test.go @@ -757,7 +757,7 @@ func (s *SharedServerSuite) TestWorkflow_Describe_NexusOperationAndCallback() { out = res.Stdout.String() s.ContainsOnSameLine(out, "WorkflowId", handlerWorkflowID) s.Contains(out, "Callbacks: 1") - s.ContainsOnSameLine(out, "URL", "http://"+s.DevServer.Options.FrontendIP) + s.ContainsOnSameLine(out, "URL", "temporal://system") s.ContainsOnSameLine(out, "Trigger", "WorkflowClosed") s.ContainsOnSameLine(out, "State", "Succeeded") From 3a137776fba94a9dc6e4ff3eed0dbf62d1b03d3e Mon Sep 17 00:00:00 2001 From: "alex.stanfield" <13949480+chaptersix@users.noreply.github.com> Date: Fri, 30 Jan 2026 10:23:33 -0600 Subject: [PATCH 2/6] remove callback url template --- internal/devserver/server.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/internal/devserver/server.go b/internal/devserver/server.go index 7606ed0ea..f726c0cd3 100644 --- a/internal/devserver/server.go +++ b/internal/devserver/server.go @@ -242,11 +242,7 @@ func (s *StartOptions) buildServerOptions() ([]temporal.ServerOption, *slog.Leve // Up default visibility RPS dynConf[dynamicconfig.FrontendMaxNamespaceVisibilityRPSPerInstance.Key()] = 100 // Enable the system callback URL for worker targets. - // NOTE that the URL scheme is fixed to HTTP since the dev server doesn't support TLS at the time of writing. - // The callback URL template is used as a fallback for external targets. dynConf[nexusoperations.UseSystemCallbackURL.Key()] = true - dynConf[nexusoperations.CallbackURLTemplate.Key()] = fmt.Sprintf( - "http://%s:%d/namespaces/{{.NamespaceName}}/nexus/callback", MaybeEscapeIPv6(s.FrontendIP), s.FrontendHTTPPort) dynConf[callbacks.AllowedAddresses.Key()] = []struct { Pattern string AllowInsecure bool From 9474b9ee4c12d2e2cd4b5e06ffb31e1b48650512 Mon Sep 17 00:00:00 2001 From: "alex.stanfield" <13949480+chaptersix@users.noreply.github.com> Date: Fri, 30 Jan 2026 10:24:19 -0600 Subject: [PATCH 3/6] remove callbacks allowed addresses --- internal/devserver/server.go | 9 --------- 1 file changed, 9 deletions(-) diff --git a/internal/devserver/server.go b/internal/devserver/server.go index f726c0cd3..0b57cd879 100644 --- a/internal/devserver/server.go +++ b/internal/devserver/server.go @@ -243,15 +243,6 @@ func (s *StartOptions) buildServerOptions() ([]temporal.ServerOption, *slog.Leve dynConf[dynamicconfig.FrontendMaxNamespaceVisibilityRPSPerInstance.Key()] = 100 // Enable the system callback URL for worker targets. dynConf[nexusoperations.UseSystemCallbackURL.Key()] = true - dynConf[callbacks.AllowedAddresses.Key()] = []struct { - Pattern string - AllowInsecure bool - }{ - { - Pattern: fmt.Sprintf("%s:%d", MaybeEscapeIPv6(s.FrontendIP), s.FrontendHTTPPort), - AllowInsecure: true, - }, - } // Dynamic config if set for k, v := range s.DynamicConfigValues { From b6ba73ed953c25e0d5af4fb1cb1e02cf674a76e4 Mon Sep 17 00:00:00 2001 From: "alex.stanfield" <13949480+chaptersix@users.noreply.github.com> Date: Fri, 30 Jan 2026 11:44:59 -0600 Subject: [PATCH 4/6] fix test failures --- internal/devserver/server.go | 3 ++- .../temporalcli/commands.workflow_view_test.go | 17 +++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/internal/devserver/server.go b/internal/devserver/server.go index 0b57cd879..d55824c54 100644 --- a/internal/devserver/server.go +++ b/internal/devserver/server.go @@ -47,13 +47,13 @@ import ( "go.temporal.io/server/common/metrics" sqliteplugin "go.temporal.io/server/common/persistence/sql/sqlplugin/sqlite" "go.temporal.io/server/common/primitives" - "go.temporal.io/server/components/callbacks" "go.temporal.io/server/components/nexusoperations" "go.temporal.io/server/schema/sqlite" sqliteschema "go.temporal.io/server/schema/sqlite" "go.temporal.io/server/temporal" "google.golang.org/grpc" "gopkg.in/yaml.v3" + "go.temporal.io/server/components/callbacks" ) const ( @@ -244,6 +244,7 @@ func (s *StartOptions) buildServerOptions() ([]temporal.ServerOption, *slog.Leve // Enable the system callback URL for worker targets. dynConf[nexusoperations.UseSystemCallbackURL.Key()] = true + dynConf[callbacks.AllowedAddresses.Key()] = true // Dynamic config if set for k, v := range s.DynamicConfigValues { dynConf[dynamicconfig.MakeKey(k)] = v diff --git a/internal/temporalcli/commands.workflow_view_test.go b/internal/temporalcli/commands.workflow_view_test.go index 3ac1b73c9..5abb30068 100644 --- a/internal/temporalcli/commands.workflow_view_test.go +++ b/internal/temporalcli/commands.workflow_view_test.go @@ -777,11 +777,11 @@ func (s *SharedServerSuite) TestWorkflow_Describe_NexusOperationAndCallback() { func (s *SharedServerSuite) TestWorkflow_Describe_NexusOperationBlocked() { endpointName := validEndpointName(s.T()) - // Call an unreachable operation from this workflow. + // Call an operation that has no handler registered. callerWorkflow := func(ctx workflow.Context) error { client := workflow.NewNexusClient(endpointName, "test-service") fut := client.ExecuteOperation(ctx, "test-op", nil, workflow.NexusOperationOptions{}) - // Destination is unreachable, the future will never complete. + // No handler is registered, the operation will fail and trigger the circuit breaker. return fut.GetNexusOperationExecution().Get(ctx, nil) } @@ -790,16 +790,19 @@ func (s *SharedServerSuite) TestWorkflow_Describe_NexusOperationBlocked() { }) defer w.Stop() - // Create an endpoint for this test. + // Create an endpoint for this test pointing to a worker target. + // The worker has no handler for "test-service"/"test-op", so requests will fail + // and eventually trigger the circuit breaker. _, err := s.Client.OperatorService().CreateNexusEndpoint( s.Context, &operatorservice.CreateNexusEndpointRequest{ Spec: &nexuspb.EndpointSpec{ Name: endpointName, Target: &nexuspb.EndpointTarget{ - Variant: &nexuspb.EndpointTarget_External_{ - External: &nexuspb.EndpointTarget_External{ - Url: "http://localhost:12345", // unreachable destination + Variant: &nexuspb.EndpointTarget_Worker_{ + Worker: &nexuspb.EndpointTarget_Worker{ + Namespace: s.Namespace(), + TaskQueue: w.Options.TaskQueue, }, }, }, @@ -808,7 +811,6 @@ func (s *SharedServerSuite) TestWorkflow_Describe_NexusOperationBlocked() { ) s.NoError(err) - // Start the workflow and wait until the operation is started. run, err := s.Client.ExecuteWorkflow( s.Context, client.StartWorkflowOptions{TaskQueue: w.Options.TaskQueue}, @@ -847,7 +849,6 @@ func (s *SharedServerSuite) TestWorkflow_Describe_NexusOperationBlocked() { s.ContainsOnSameLine(out, "Operation", "test-op") s.ContainsOnSameLine(out, "BlockedReason", "The circuit breaker is open.") - // Operations - JSON res = s.Execute( "workflow", "describe", "--address", s.Address(), From ac81af0deddeeaa65dcc17ea861d9d80ea825384 Mon Sep 17 00:00:00 2001 From: Alex Stanfield <13949480+chaptersix@users.noreply.github.com> Date: Sat, 31 Jan 2026 20:50:18 -0600 Subject: [PATCH 5/6] Update internal/devserver/server.go Co-authored-by: Roey Berman --- internal/devserver/server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/devserver/server.go b/internal/devserver/server.go index d55824c54..c9a01474f 100644 --- a/internal/devserver/server.go +++ b/internal/devserver/server.go @@ -242,6 +242,7 @@ func (s *StartOptions) buildServerOptions() ([]temporal.ServerOption, *slog.Leve // Up default visibility RPS dynConf[dynamicconfig.FrontendMaxNamespaceVisibilityRPSPerInstance.Key()] = 100 // Enable the system callback URL for worker targets. + // TODO: Remove this when upgrading to server 1.31. dynConf[nexusoperations.UseSystemCallbackURL.Key()] = true dynConf[callbacks.AllowedAddresses.Key()] = true From 515439e8b954251ed400bc85a26d3f1fab94c5f7 Mon Sep 17 00:00:00 2001 From: "alex.stanfield" <13949480+chaptersix@users.noreply.github.com> Date: Sat, 31 Jan 2026 21:25:36 -0600 Subject: [PATCH 6/6] remove allow all addresses --- internal/devserver/server.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/internal/devserver/server.go b/internal/devserver/server.go index c9a01474f..ac9df2cb7 100644 --- a/internal/devserver/server.go +++ b/internal/devserver/server.go @@ -53,7 +53,6 @@ import ( "go.temporal.io/server/temporal" "google.golang.org/grpc" "gopkg.in/yaml.v3" - "go.temporal.io/server/components/callbacks" ) const ( @@ -245,7 +244,6 @@ func (s *StartOptions) buildServerOptions() ([]temporal.ServerOption, *slog.Leve // TODO: Remove this when upgrading to server 1.31. dynConf[nexusoperations.UseSystemCallbackURL.Key()] = true - dynConf[callbacks.AllowedAddresses.Key()] = true // Dynamic config if set for k, v := range s.DynamicConfigValues { dynConf[dynamicconfig.MakeKey(k)] = v