Esempio n. 1
0
        public async Task <PlanResourceChange.Types.Response> PlanResourceChange(PlanResourceChange.Types.Request request)
        {
            var prior    = DeserializeDynamicValue(request.PriorState);
            var proposed = DeserializeDynamicValue(request.ProposedNewState);

            var planned = await _resourceProvider.PlanAsync(prior, proposed);

            var plannedSerialized = SerializeDynamicValue(planned);

            return(new PlanResourceChange.Types.Response
            {
                PlannedState = plannedSerialized,
            });
        }
        private void WriteInput(Type resType, PlanResourceChange.Types.Request request, Type inputType, object input)
        {
            var config           = request.Config.UnmarshalFromDynamicValue(resType);
            var priorState       = request.PriorState.UnmarshalFromDynamicValue(resType);
            var priorPrivate     = request.PriorPrivate.ToByteArray();
            var proposedNewState = request.ProposedNewState.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("Planning " + changeType.ToString().ToUpper());

            inputType.GetProperty(nameof(HasPlanResourceChange.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.PriorPrivate))
            .SetValue(input, priorPrivate);
            inputType.GetProperty(nameof(request.ProposedNewState))
            .SetValue(input, proposedNewState);
        }
Esempio n. 3
0
    public override Task <PlanResourceChange.Types.Response> PlanResourceChange(PlanResourceChange.Types.Request request, ServerCallContext context)
    {
        if (!_resourceRegistry.Types.TryGetValue(request.TypeName, out var resourceType))
        {
            return(Task.FromResult(new Tfplugin5.PlanResourceChange.Types.Response
            {
                Diagnostics =
                {
                    new Diagnostic {
                        Detail = "Unkonwn type name."
                    },
                },
            }));
        }

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

        return((Task <PlanResourceChange.Types.Response>)providerHostType.GetMethod(nameof(ResourceProviderHost <object> .PlanResourceChange))
               .Invoke(provider, new[] { request }));
    }
        public override async Task <PlanResourceChange.Types.Response> PlanResourceChange(
            PlanResourceChange.Types.Request request, ServerCallContext context)
        {
            var response = new PlanResourceChange.Types.Response();

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

            if (providerType.HasPlanResourceChangeSkill(resType))
            {
                providerType.InvokePlanResourceChangeSkill(
                    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 planning change for resource [{type}]", resType);
            }

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