in src/Azure.Deployments.Extensibility.Extensions.Kubernetes/KubernetesExtension.cs [34:66]
public async Task<IResult> PreviewResourceCreateOrUpdateAsync(HttpContext httpContext, ResourceSpecification resourceSpecification, CancellationToken cancellationToken)
{
this.resourceSpecificationValidator.ValidateAndThrow(resourceSpecification);
var groupVersionKind = ModelMapper.MapToGroupVersionKind(resourceSpecification.Type, resourceSpecification.ApiVersion);
var k8sObject = new K8sObject(groupVersionKind, resourceSpecification.Properties);
using var client = await this.k8sClientFactory.CreateAsync(resourceSpecification.Config);
var api = await new K8sApiDiscovery(client).FindApiAsync(groupVersionKind, cancellationToken);
var configId = CalculateConfigId(client);
// Do config ID checksum validation if one is supplied.
if (resourceSpecification.ConfigId is not null && !TryMatchConfigurationId(resourceSpecification.ConfigId, configId, out var configIdErrorResult))
{
return configIdErrorResult;
}
if (api.Namespaced && (k8sObject.Namespace ?? client.DefaultNamespace) is { } @namespace)
{
if (await client.GetNamespaceAsync(@namespace, cancellationToken: cancellationToken) is null)
{
// Namespace does not exist. Perform client-side dry run.
k8sObject.Metadata["namespace"] = @namespace;
return Results.Ok(ModelMapper.MapToResource(K8sObjectIdentifiers.Create(k8sObject), k8sObject, configId));
}
}
k8sObject = await api.PatchObjectAsync(k8sObject, dryRun: true, cancellationToken);
return Results.Ok(ModelMapper.MapToResource(K8sObjectIdentifiers.Create(k8sObject), k8sObject, configId));
}