From cd3da7e172c4890aceb379494e0f859c3f95bcd4 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Sun, 26 Apr 2020 13:03:44 -0700 Subject: [PATCH] Add undeploy support for ingress --- src/tye/UndeployHost.cs | 54 +++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/src/tye/UndeployHost.cs b/src/tye/UndeployHost.cs index 8e340c15..b27d64b2 100644 --- a/src/tye/UndeployHost.cs +++ b/src/tye/UndeployHost.cs @@ -75,7 +75,7 @@ namespace Microsoft.Tye resource.Kind = V1Service.KubeKind; } - resources.AddRange(response.Body.Items.Select(item => new Resource(item, item.Metadata, DeleteService))); + resources.AddRange(response.Body.Items.Select(item => new Resource(item.Kind, item.Metadata, DeleteService))); output.WriteDebugLine($"Found {response.Body.Items.Count} matching services"); } catch (Exception ex) @@ -97,7 +97,7 @@ namespace Microsoft.Tye resource.Kind = V1Deployment.KubeKind; } - resources.AddRange(response.Body.Items.Select(item => new Resource(item, item.Metadata, DeleteDeployment))); + resources.AddRange(response.Body.Items.Select(item => new Resource(item.Kind, item.Metadata, DeleteDeployment))); output.WriteDebugLine($"Found {response.Body.Items.Count} matching deployments"); } catch (Exception ex) @@ -119,7 +119,7 @@ namespace Microsoft.Tye resource.Kind = V1Secret.KubeKind; } - resources.AddRange(response.Body.Items.Select(item => new Resource(item, item.Metadata, DeleteSecret))); + resources.AddRange(response.Body.Items.Select(item => new Resource(item.Kind, item.Metadata, DeleteSecret))); output.WriteDebugLine($"Found {response.Body.Items.Count} matching secrets"); } @@ -130,13 +130,36 @@ namespace Microsoft.Tye throw new CommandException("Unable connect to kubernetes.", ex); } + try + { + output.WriteDebugLine("Querying ingresses"); + var response = await kubernetes.ListNamespacedIngressWithHttpMessagesAsync( + config.Namespace, + labelSelector: $"app.kubernetes.io/part-of={application.Name}"); + + foreach (var resource in response.Body.Items) + { + resource.Kind = "Ingress"; + } + + resources.AddRange(response.Body.Items.Select(item => new Resource(item.Kind, item.Metadata, DeleteIngress))); + output.WriteDebugLine($"Found {response.Body.Items.Count} matching ingress"); + + } + catch (Exception ex) + { + output.WriteDebugLine("Failed to query ingress."); + output.WriteDebugLine(ex.ToString()); + throw new CommandException("Unable connect to kubernetes.", ex); + } + output.WriteInfoLine($"Found {resources.Count} resource(s)."); var exceptions = new List<(Resource resource, HttpOperationException exception)>(); foreach (var resource in resources) { var operation = Operations.Delete; - if (interactive && !output.Confirm($"Delete {resource.Obj.Kind} '{resource.Metadata.Name}'?")) + if (interactive && !output.Confirm($"Delete {resource.Kind} '{resource.Metadata.Name}'?")) { operation = Operations.None; } @@ -148,25 +171,25 @@ namespace Microsoft.Tye if (operation == Operations.None) { - output.WriteAlwaysLine($"Skipping '{resource.Obj.Kind}' '{resource.Metadata.Name}' ..."); + output.WriteAlwaysLine($"Skipping '{resource.Kind}' '{resource.Metadata.Name}' ..."); } else if (operation == Operations.Explain) { - output.WriteAlwaysLine($"whatif: Deleting '{resource.Obj.Kind}' '{resource.Metadata.Name}' ..."); + output.WriteAlwaysLine($"whatif: Deleting '{resource.Kind}' '{resource.Metadata.Name}' ..."); } else if (operation == Operations.Delete) { - output.WriteAlwaysLine($"Deleting '{resource.Obj.Kind}' '{resource.Metadata.Name}' ..."); + output.WriteAlwaysLine($"Deleting '{resource.Kind}' '{resource.Metadata.Name}' ..."); try { var response = await resource.Deleter(resource.Metadata.Name); - output.WriteDebugLine($"Successfully deleted resource: '{resource.Obj.Kind}' '{resource.Metadata.Name}'."); + output.WriteDebugLine($"Successfully deleted resource: '{resource.Kind}' '{resource.Metadata.Name}'."); } catch (HttpOperationException ex) { - output.WriteDebugLine($"Failed to delete resource: '{resource.Obj.Kind}' '{resource.Metadata.Name}'."); + output.WriteDebugLine($"Failed to delete resource: '{resource.Kind}' '{resource.Metadata.Name}'."); output.WriteDebugLine(ex.ToString()); exceptions.Add((resource, ex)); } @@ -177,7 +200,7 @@ namespace Microsoft.Tye { throw new CommandException( $"Failed to delete some resources: " + Environment.NewLine + Environment.NewLine + - string.Join(Environment.NewLine, exceptions.Select(e => $"\t'{e.resource.Obj.Kind}' '{e.resource.Metadata.Name}': {e.exception.Body}."))); + string.Join(Environment.NewLine, exceptions.Select(e => $"\t'{e.resource.Kind}' '{e.resource.Metadata.Name}': {e.exception.Body}."))); } Task> DeleteService(string name) @@ -194,6 +217,11 @@ namespace Microsoft.Tye { return kubernetes!.DeleteNamespacedSecretWithHttpMessagesAsync(name, config!.Namespace); } + + Task> DeleteIngress(string name) + { + return kubernetes!.DeleteNamespacedIngressWithHttpMessagesAsync(name, config!.Namespace); + } } private enum Operations @@ -205,13 +233,13 @@ namespace Microsoft.Tye private readonly struct Resource { - public readonly IKubernetesObject Obj; + public readonly string Kind; public readonly V1ObjectMeta Metadata; public readonly Func>> Deleter; - public Resource(IKubernetesObject obj, V1ObjectMeta metadata, Func>> deleter) + public Resource(string kind, V1ObjectMeta metadata, Func>> deleter) { - Obj = obj; + Kind = kind; Metadata = metadata; Deleter = deleter; }