umbraco / Umbraco.Deploy.Issues

1 stars 0 forks source link

13.0.4 Umbraco Cloud - Restore Fails with No connector registered for entity type "forms-form" #208

Closed paulsterling closed 6 months ago

paulsterling commented 6 months ago

Restoring content from a cloud environment to local fails with the following error:

System.NotSupportedException: No connector registered for entity type "forms-form".

The same error is present for all types of restore operations including importing a Zip export from the cloud environment.

The workaround is to add forms-form to the ExcludedEntityTypes setting in appSettings.json. But, of course, this means Forms are not included in Deploy operations I believe.

"Umbraco": {
    "CMS": {
    "Deploy": {
      "Settings": {
        "ExcludedEntityTypes": [ "forms-form" ]
      }
    }
    }
  }

Versions CMS 13.1.1 Deploy 13.0.4 Forms 13.0.2

Deploy Log

8488eed2 - Executing, 10%
8488eed2 - Executing, 10% - Get remote session
8488eed2 - Executing, 20% - Create manifest on source
8488eed2 - Executing, 80% - Exception!
8488eed2 - Executing, 80% - Abort remote session
8488eed2 - Executing, 80% - Restore caches and indexes
8488eed2 - Failed, 80% - Total time 00:00:02.813.

-- EXCEPTION ---------------------------------------------------
 (proper exception traces at the end of this log)
System.NotSupportedException: No connector registered for entity type "forms-form".
Umbraco.Deploy.Infrastructure.Exceptions.RemoteApiException: The remote API has thrown an exception.
----------------------------------------------------------------

EXCEPTION:

Umbraco.Deploy.Infrastructure.Exceptions.RemoteApiException: The remote API has thrown an exception.
   at Umbraco.Deploy.Infrastructure.Http.DeployHttpClient.SucceedOrThrow(HttpResponseMessage result, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Http.DeployHttpClient.SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Http.DeployHttpClient.SendAsync(HttpRequestMessage request, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Environments.RemoteUmbracoEnvironment.WaitAction(Guid sessionId, JsonSerializerSettings serializerSettings, String action, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Environments.RemoteUmbracoEnvironment.CreateManifestAsync(Guid sessionId, IEnumerable`1 ranges, IEnumerable`1 exclude, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.DeployRestoreWorkItemBase.CreateManifestOnSource(IEnumerable`1 ranges, IEnumerable`1 exclude)
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.TargetPartialRestoreWorkItem.Proceed()
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.TargetPartialRestoreWorkItem.ExecuteAsyncSub(IWorkContext context, List`1 resume, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.TargetPartialRestoreWorkItem.ExecuteAsyncSub(IWorkContext context, List`1 resume, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.TargetPartialRestoreWorkItem.ExecuteAsync(IWorkContext context, CancellationToken token)

REMOTE:
System.NotSupportedException: No connector registered for entity type "forms-form".

   at Umbraco.Deploy.Infrastructure.Environments.CurrentEnvironment.GetDependencyArtifact(ArtifactDependency dep, DependentArtifactState& dependentArtifactState, String& dependencyName, String& dependencyErrorMessage, IContextCache contextCache)
   at Umbraco.Deploy.Infrastructure.Environments.CurrentEnvironment.AddEntries(Manifest manifest, List`1 sigs, IEnumerable`1 items, HashSet`1 exclude, IWorkItem workItem, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Environments.CurrentEnvironment.CreateManifestAsync(Guid sessionId, IEnumerable`1 ranges, IEnumerable`1 exclude, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Environments.CurrentEnvironment.CreateManifest(Guid sessionId, IEnumerable`1 ranges, IEnumerable`1 exclude)
   at Umbraco.Deploy.Infrastructure.Environments.EnvironmentController.<>c__DisplayClass18_0.<BeginCreateManifestForRanges>b__1()
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.SessionWorkItem.<>c__DisplayClass29_0.<ExecuteAction>b__0(CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.SessionWorkItem.ExecuteAsync(IWorkContext context, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.SessionWorkItem.WaitIdle()
   at Umbraco.Deploy.Infrastructure.Environments.EnvironmentController.WaitIdle(SessionActionModel model)
   at lambda_method386290(Closure, Object, Object[])
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
AndyButland commented 6 months ago

That sounds like it would be the case if you didn't have the Umbraco.Forms.Deploy package installed. This should be there on Cloud projects of course - and I've just verified it is for a new one and that I can restore forms - but please could you double-check it's referenced in your .csproj file?

paulsterling commented 6 months ago

Hi @AndyButland -

I can confirm the project has Umbraco.Forms.Deploy referenced but the issue persists. One note about these projects (we see the same behavior for two of our cloud projects) is that these were upgraded from v12 > v13. When we did the upgrade the v12 reference to Umbraco.Deploy.Forms v12.1.3 was still present in .csproj and we manually updated the package reference to Umbraco.Forms.Deploy. A third project, also upgraded v12 > v13, without reference to Umbraco.Forms.Deploy in .csproj does not run into this issue - that project has no Forms in use so I expect that is the reason.

At the moment, the workaround by adding "ExcludedEntityTypes": [ "forms-form" ] is allowing us to continue.

.csproj

...
      <PackageReference Include="Umbraco.Cloud.Cms.PublicAccess" Version="13.0.0" />
      <PackageReference Include="Umbraco.Cloud.Identity.Cms" Version="13.0.0" />
      <PackageReference Include="Umbraco.Cloud.StorageProviders.AzureBlob" Version="13.0.0" />
      <PackageReference Include="Umbraco.Cms" Version="13.1.1" />
      <PackageReference Include="Umbraco.Cms.Core" Version="13.1.1" />
      <PackageReference Include="Umbraco.Cms.Web.BackOffice" Version="13.1.1" />
      <PackageReference Include="Umbraco.Cms.Web.Common" Version="13.1.1" />
      <PackageReference Include="Umbraco.Cms.Web.Website" Version="13.1.1" />
      <PackageReference Include="Umbraco.Deploy.Cloud" Version="13.0.4" />
      <PackageReference Include="Umbraco.Deploy.Infrastructure" Version="13.0.4" />
      <PackageReference Include="Umbraco.Deploy.Contrib" Version="13.0.0" />
      <PackageReference Include="Umbraco.Forms" Version="13.0.2" />
      <PackageReference Include="Umbraco.Forms.Core.Providers" Version="13.0.2" />
      <PackageReference Include="Umbraco.Forms.Deploy" Version="13.0.0" />
...

Deploy Log

4cdb3077 - Executing, 10%
4cdb3077 - Executing, 10% - Get remote session
4cdb3077 - Executing, 20% - Create manifest on source
4cdb3077 - Executing, 80% - Exception!
4cdb3077 - Executing, 80% - Abort remote session
4cdb3077 - Executing, 80% - Restore caches and indexes
4cdb3077 - Failed, 80% - Total time 00:00:02.706.

-- EXCEPTION ---------------------------------------------------
 (proper exception traces at the end of this log)
System.NotSupportedException: No connector registered for entity type "forms-form".
Umbraco.Deploy.Infrastructure.Exceptions.RemoteApiException: The remote API has thrown an exception.
----------------------------------------------------------------

EXCEPTION:

Umbraco.Deploy.Infrastructure.Exceptions.RemoteApiException: The remote API has thrown an exception.
   at Umbraco.Deploy.Infrastructure.Http.DeployHttpClient.SucceedOrThrow(HttpResponseMessage result, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Http.DeployHttpClient.SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Http.DeployHttpClient.SendAsync(HttpRequestMessage request, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Environments.RemoteUmbracoEnvironment.WaitAction(Guid sessionId, JsonSerializerSettings serializerSettings, String action, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Environments.RemoteUmbracoEnvironment.CreateManifestAsync(Guid sessionId, IEnumerable`1 ranges, IEnumerable`1 exclude, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.DeployRestoreWorkItemBase.CreateManifestOnSource(IEnumerable`1 ranges, IEnumerable`1 exclude)
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.TargetPartialRestoreWorkItem.Proceed()
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.TargetPartialRestoreWorkItem.ExecuteAsyncSub(IWorkContext context, List`1 resume, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.TargetPartialRestoreWorkItem.ExecuteAsyncSub(IWorkContext context, List`1 resume, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.TargetPartialRestoreWorkItem.ExecuteAsync(IWorkContext context, CancellationToken token)

REMOTE:
System.NotSupportedException: No connector registered for entity type "forms-form".

   at Umbraco.Deploy.Infrastructure.Environments.CurrentEnvironment.GetDependencyArtifact(ArtifactDependency dep, DependentArtifactState&amp; dependentArtifactState, String&amp; dependencyName, String&amp; dependencyErrorMessage, IContextCache contextCache)
   at Umbraco.Deploy.Infrastructure.Environments.CurrentEnvironment.AddEntries(Manifest manifest, List`1 sigs, IEnumerable`1 items, HashSet`1 exclude, IWorkItem workItem, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Environments.CurrentEnvironment.CreateManifestAsync(Guid sessionId, IEnumerable`1 ranges, IEnumerable`1 exclude, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Environments.CurrentEnvironment.CreateManifest(Guid sessionId, IEnumerable`1 ranges, IEnumerable`1 exclude)
   at Umbraco.Deploy.Infrastructure.Environments.EnvironmentController.&lt;&gt;c__DisplayClass18_0.&lt;BeginCreateManifestForRanges&gt;b__1()
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.SessionWorkItem.&lt;&gt;c__DisplayClass29_0.&lt;ExecuteAction&gt;b__0(CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.SessionWorkItem.ExecuteAsync(IWorkContext context, CancellationToken token)
   at Umbraco.Deploy.Infrastructure.Work.WorkItems.SessionWorkItem.WaitIdle()
   at Umbraco.Deploy.Infrastructure.Environments.EnvironmentController.WaitIdle(SessionActionModel model)
   at lambda_method552352(Closure, Object, Object[])
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State&amp; next, Scope&amp; scope, Object&amp; state, Boolean&amp; isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State&amp; next, Scope&amp; scope, Object&amp; state, Boolean&amp; isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.&lt;InvokeNextExceptionFilterAsync&gt;g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
AndyButland commented 6 months ago

It's a stretch as not sure why this would leave you with no connector registered, but perhaps having upgraded there's still a dll hanging around of the old assembly that's interfering? You could check that via the Kudu tools. Or otherwise, if you could reach out to support we can have someone, perhaps myself, have a look.

paulsterling commented 6 months ago

Hey @AndyButland

You are correct. The issue is the missing Umbraco.Forms.Deploy.dll in both the source and destination environments. For whatever reason when we did the upgrade v12 > v13 that dependency was not flagged so it was never added to the project.

I've added to local and deployed > Dev > Live as well as removed the "ExcludedEntityTypes": [ "forms-form" ] setting and can confirm content Restore and Transfer works as expected.

Closing this issue.