コード例 #1
0
        public async Task <ApplyResourceChange.Types.Response> ApplyResourceChange(ApplyResourceChange.Types.Request request)
        {
            var prior   = DeserializeDynamicValue(request.PriorState);
            var planned = DeserializeDynamicValue(request.PlannedState);

            if (planned == null)
            {
                // Delete
                await _resourceProvider.DeleteAsync(prior);

                return(new ApplyResourceChange.Types.Response());
            }
            else if (prior == null)
            {
                // Create
                var created = await _resourceProvider.CreateAsync(planned);

                var createdSerialized = SerializeDynamicValue(created);
                return(new ApplyResourceChange.Types.Response
                {
                    NewState = createdSerialized,
                });
            }
            else
            {
                // Update
                var updated = await _resourceProvider.UpdateAsync(prior, planned);

                var updatedSerialized = SerializeDynamicValue(updated);
                return(new ApplyResourceChange.Types.Response
                {
                    NewState = updatedSerialized,
                });
            }
        }
コード例 #2
0
        private void WriteInput(Type resType, ApplyResourceChange.Types.Request request, Type inputType, object input)
        {
            var config         = request.Config.UnmarshalFromDynamicValue(resType);
            var priorState     = request.PriorState.UnmarshalFromDynamicValue(resType);
            var plannedPrivate = request.PlannedPrivate.ToByteArray();
            var plannedState   = request.PlannedState.UnmarshalFromDynamicValue(resType);

            var changeType = TFResourceChangeType.Unknown;

            if (priorState != null)
            {
                if (config == null)
                {
                    changeType = TFResourceChangeType.Delete;
                }
                else
                {
                    changeType = TFResourceChangeType.Update;
                }
            }
            else
            if (config != null)
            {
                changeType = TFResourceChangeType.Create;
            }
            else
            {
                _log.LogWarning("Planning NULL -> NULL : You Should Never See This!");
            }

            _log.LogDebug("Applying " + changeType.ToString().ToUpper());

            inputType.GetProperty(nameof(HasApplyResourceChange.Input <object> .ChangeType))
            .SetValue(input, changeType);
            inputType.GetProperty(nameof(request.Config))
            .SetValue(input, config);
            inputType.GetProperty(nameof(request.PriorState))
            .SetValue(input, priorState);
            inputType.GetProperty(nameof(request.PlannedPrivate))
            .SetValue(input, plannedPrivate);
            inputType.GetProperty(nameof(request.PlannedState))
            .SetValue(input, plannedState);
        }
コード例 #3
0
    public override Task <ApplyResourceChange.Types.Response> ApplyResourceChange(ApplyResourceChange.Types.Request request, ServerCallContext context)
    {
        if (!_resourceRegistry.Types.TryGetValue(request.TypeName, out var resourceType))
        {
            return(Task.FromResult(new ApplyResourceChange.Types.Response
            {
                Diagnostics =
                {
                    new Diagnostic {
                        Detail = "Unkonwn type name."
                    },
                },
            }));
        }

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

        return((Task <ApplyResourceChange.Types.Response>)providerHostType.GetMethod(nameof(ResourceProviderHost <object> .ApplyResourceChange))
               .Invoke(provider, new[] { request }));
    }
コード例 #4
0
        public override async Task <ApplyResourceChange.Types.Response> ApplyResourceChange(
            ApplyResourceChange.Types.Request request, ServerCallContext context)
        {
            var response = new ApplyResourceChange.Types.Response();

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

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

            return(await Task.FromResult(response));
        }