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, }); } }
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); }
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 })); }
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)); }