in src/Cli/func/Actions/KubernetesActions/KubernetesDeployAction.cs [132:245]
public override async Task RunAsync()
{
(var resolvedImageName, var shouldBuild) = await ResolveImageName();
TriggersPayload triggers = null;
if (DryRun)
{
if (shouldBuild)
{
// don't build on a --dry-run.
// read files from the local dir
triggers = await GetTriggersLocalFiles();
}
else
{
triggers = await DockerHelpers.GetTriggersFromDockerImage(resolvedImageName);
}
}
else if (BuildImage)
{
if (shouldBuild)
{
await DockerHelpers.DockerBuild(resolvedImageName, Environment.CurrentDirectory);
}
// This needs to be fixed to run after the build.
triggers = await DockerHelpers.GetTriggersFromDockerImage(resolvedImageName);
}
else
{
triggers = await GetTriggersLocalFiles();
}
(var resources, var funcKeys) = await KubernetesHelper.GetFunctionsDeploymentResources(
Name,
resolvedImageName,
Namespace,
triggers,
_secretsManager.GetSecrets(),
PullSecret,
SecretsCollectionName,
ConfigMapName,
UseConfigMap,
PollingInterval,
CooldownPeriod,
ServiceType,
MinReplicaCount,
MaxReplicaCount,
KeysSecretCollectionName,
MountFuncKeysAsContainerVolume,
KedaVersion,
KeySecretAnnotations);
if (DryRun)
{
ColoredConsole.WriteLine(KubernetesHelper.SerializeResources(resources, OutputSerializationOptions.Yaml));
}
else
{
Task kubernetesTask = null;
Task imageTask = (BuildImage && shouldBuild) ? DockerHelpers.DockerPush(resolvedImageName, false) : null;
if (WriteConfigs)
{
var yaml = KubernetesHelper.SerializeResources(resources, OutputSerializationOptions.Yaml);
kubernetesTask = File.WriteAllTextAsync(ConfigFile, yaml);
Console.Write($"Configuration written to {ConfigFile}");
return;
}
else
{
Func<Task> resourceTaskFn = () =>
{
var serialized = KubernetesHelper.SerializeResources(resources, OutputSerializationOptions.Yaml);
return KubectlHelper.KubectlApply(serialized, showOutput: true, ignoreError: IgnoreErrors, @namespace: Namespace);
};
if (!await KubernetesHelper.NamespaceExists(Namespace))
{
kubernetesTask = KubernetesHelper.CreateNamespace(Namespace).ContinueWith((result) =>
{
return resourceTaskFn();
});
}
else
{
kubernetesTask = resourceTaskFn();
}
}
if (imageTask != null)
{
await imageTask;
}
await kubernetesTask;
var httpService = resources
.Where(i => i is ServiceV1)
.Cast<ServiceV1>()
.FirstOrDefault(s => s.Metadata.Name.Contains("http"));
var httpDeployment = resources
.Where(i => i is DeploymentV1Apps)
.Cast<DeploymentV1Apps>()
.FirstOrDefault(d => d.Metadata.Name.Contains("http"));
if (httpDeployment != null)
{
await KubernetesHelper.WaitForDeploymentRollout(httpDeployment);
// Print the function keys message to the console
await KubernetesHelper.PrintFunctionsInfo(httpDeployment, httpService, funcKeys, triggers, ShowServiceFqdn);
}
}
}