public async Task <ImportResourceState.Types.Response> ImportResourceState(ImportResourceState.Types.Request request)
    {
        var imported = await _resourceProvider.ImportAsync(request.Id);

        var response = new ImportResourceState.Types.Response();

        response.ImportedResources.AddRange(imported.Select(resource => new ImportResourceState.Types.ImportedResource
        {
            TypeName = request.TypeName,
            State    = SerializeDynamicValue(resource),
        }));

        return(response);
    }
Esempio n. 2
0
    public override Task <ImportResourceState.Types.Response> ImportResourceState(ImportResourceState.Types.Request request, ServerCallContext context)
    {
        if (!_resourceRegistry.Types.TryGetValue(request.TypeName, out var resourceType))
        {
            return(Task.FromResult(new ImportResourceState.Types.Response
            {
                Diagnostics =
                {
                    new Diagnostic {
                        Detail = "Unkonwn type name."
                    },
                },
            }));
        }

        var providerHostType = typeof(ResourceProviderHost <>).MakeGenericType(resourceType);
        var provider         = _serviceProvider.GetService(providerHostType);

        return((Task <ImportResourceState.Types.Response>)providerHostType.GetMethod(nameof(ResourceProviderHost <object> .ImportResourceState))
               .Invoke(provider, new[] { request }));
    }
        private void ReadResult(Type resType, Type resultType, object result,
                                ImportResourceState.Types.Request request,
                                ImportResourceState.Types.Response response)
        {
            var diagnostics = ((TFDiagnostics)resultType
                               .GetProperty(nameof(response.Diagnostics))
                               .GetValue(result));

            if (diagnostics.Count() > 0)
            {
                response.Diagnostics.Add(diagnostics.All());
            }

            var importedEnum = resultType.GetProperty(nameof(response.ImportedResources))
                               .GetValue(result) as System.Collections.IEnumerable;

            if (importedEnum != null)
            {
                var importedType = typeof(TFImportedResource <>).MakeGenericType(resType);
                var stateProp    = importedType
                                   .GetProperty(nameof(TFImportedResource <object> .State));
                var privateProp = importedType
                                  .GetProperty(nameof(TFImportedResource <object> .Private));

                var importedResult = new List <ImportResourceState.Types.ImportedResource>();
                foreach (var imported in importedEnum)
                {
                    importedResult.Add(new ImportResourceState.Types.ImportedResource
                    {
                        // We assume the outgoing is the same as incoming
                        TypeName = request.TypeName,
                        // Convert over private and schema-defined state
                        State   = stateProp.GetValue(imported).MarshalToDynamicValue(resType),
                        Private = ByteString.CopyFrom((byte[])privateProp.GetValue(imported)),
                    });
                }
                response.ImportedResources.Add(importedResult);
            }
        }
        public override async Task <ImportResourceState.Types.Response> ImportResourceState(
            ImportResourceState.Types.Request request, ServerCallContext context)
        {
            var response = new ImportResourceState.Types.Response();

            var providerType = _schemaResolver.PluginDetails.Provider;
            var resType      = _schemaResolver.GetResourceSchemas()[request.TypeName].Type;

            if (providerType.HasImportResourceStateSkill(resType))
            {
                providerType.InvokeImportResourceStateSkill(
                    PluginProviderInstance,
                    resType,
                    writeInput: (inputType, input) => WriteInput(resType, request, inputType, input),
                    readResult: (resultType, result) => ReadResult(resType, resultType, result, request, response)
                    );
            }
            else
            {
                _log.LogWarning("provider does not handle importing state for resource [{type}]", resType);
            }

            return(await Task.FromResult(response));
        }
 private void WriteInput(Type resType, ImportResourceState.Types.Request request, Type inputType, object input)
 {
     inputType.GetProperty(nameof(request.Id))
     .SetValue(input, request.Id);
 }