Browse Source

Add undeploy support for ingress

davidfowl/ingress-changes
Ryan Nowak 7 years ago
parent
commit
cd3da7e172
  1. 54
      src/tye/UndeployHost.cs

54
src/tye/UndeployHost.cs

@ -75,7 +75,7 @@ namespace Microsoft.Tye
resource.Kind = V1Service.KubeKind; 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"); output.WriteDebugLine($"Found {response.Body.Items.Count} matching services");
} }
catch (Exception ex) catch (Exception ex)
@ -97,7 +97,7 @@ namespace Microsoft.Tye
resource.Kind = V1Deployment.KubeKind; 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"); output.WriteDebugLine($"Found {response.Body.Items.Count} matching deployments");
} }
catch (Exception ex) catch (Exception ex)
@ -119,7 +119,7 @@ namespace Microsoft.Tye
resource.Kind = V1Secret.KubeKind; 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"); output.WriteDebugLine($"Found {response.Body.Items.Count} matching secrets");
} }
@ -130,13 +130,36 @@ namespace Microsoft.Tye
throw new CommandException("Unable connect to kubernetes.", ex); 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)."); output.WriteInfoLine($"Found {resources.Count} resource(s).");
var exceptions = new List<(Resource resource, HttpOperationException exception)>(); var exceptions = new List<(Resource resource, HttpOperationException exception)>();
foreach (var resource in resources) foreach (var resource in resources)
{ {
var operation = Operations.Delete; 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; operation = Operations.None;
} }
@ -148,25 +171,25 @@ namespace Microsoft.Tye
if (operation == Operations.None) 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) 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) else if (operation == Operations.Delete)
{ {
output.WriteAlwaysLine($"Deleting '{resource.Obj.Kind}' '{resource.Metadata.Name}' ..."); output.WriteAlwaysLine($"Deleting '{resource.Kind}' '{resource.Metadata.Name}' ...");
try try
{ {
var response = await resource.Deleter(resource.Metadata.Name); 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) 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()); output.WriteDebugLine(ex.ToString());
exceptions.Add((resource, ex)); exceptions.Add((resource, ex));
} }
@ -177,7 +200,7 @@ namespace Microsoft.Tye
{ {
throw new CommandException( throw new CommandException(
$"Failed to delete some resources: " + Environment.NewLine + Environment.NewLine + $"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<Rest.HttpOperationResponse<V1Status>> DeleteService(string name) Task<Rest.HttpOperationResponse<V1Status>> DeleteService(string name)
@ -194,6 +217,11 @@ namespace Microsoft.Tye
{ {
return kubernetes!.DeleteNamespacedSecretWithHttpMessagesAsync(name, config!.Namespace); return kubernetes!.DeleteNamespacedSecretWithHttpMessagesAsync(name, config!.Namespace);
} }
Task<Rest.HttpOperationResponse<V1Status>> DeleteIngress(string name)
{
return kubernetes!.DeleteNamespacedIngressWithHttpMessagesAsync(name, config!.Namespace);
}
} }
private enum Operations private enum Operations
@ -205,13 +233,13 @@ namespace Microsoft.Tye
private readonly struct Resource private readonly struct Resource
{ {
public readonly IKubernetesObject Obj; public readonly string Kind;
public readonly V1ObjectMeta Metadata; public readonly V1ObjectMeta Metadata;
public readonly Func<string, Task<Rest.HttpOperationResponse<V1Status>>> Deleter; public readonly Func<string, Task<Rest.HttpOperationResponse<V1Status>>> Deleter;
public Resource(IKubernetesObject obj, V1ObjectMeta metadata, Func<string, Task<Rest.HttpOperationResponse<V1Status>>> deleter) public Resource(string kind, V1ObjectMeta metadata, Func<string, Task<Rest.HttpOperationResponse<V1Status>>> deleter)
{ {
Obj = obj; Kind = kind;
Metadata = metadata; Metadata = metadata;
Deleter = deleter; Deleter = deleter;
} }

Loading…
Cancel
Save