mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-21 10:51:29 +00:00
Merge pull request #78703 from MrHohn/svc-e2e-name-cleanup
[e2e] Make meaningful service name in test
This commit is contained in:
commit
9162d932cf
@ -335,12 +335,16 @@ var _ = SIGDescribe("Services", func() {
|
|||||||
ns := f.Namespace.Name
|
ns := f.Namespace.Name
|
||||||
numPods, servicePort := 3, defaultServeHostnameServicePort
|
numPods, servicePort := 3, defaultServeHostnameServicePort
|
||||||
|
|
||||||
ginkgo.By("creating service1 in namespace " + ns)
|
svc1 := "up-down-1"
|
||||||
podNames1, svc1IP, err := framework.StartServeHostnameService(cs, getServeHostnameService("service1"), ns, numPods)
|
svc2 := "up-down-2"
|
||||||
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc1IP, ns)
|
svc3 := "up-down-3"
|
||||||
ginkgo.By("creating service2 in namespace " + ns)
|
|
||||||
podNames2, svc2IP, err := framework.StartServeHostnameService(cs, getServeHostnameService("service2"), ns, numPods)
|
ginkgo.By("creating " + svc1 + " in namespace " + ns)
|
||||||
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc2IP, ns)
|
podNames1, svc1IP, err := framework.StartServeHostnameService(cs, getServeHostnameService(svc1), ns, numPods)
|
||||||
|
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc1, ns)
|
||||||
|
ginkgo.By("creating " + svc2 + " in namespace " + ns)
|
||||||
|
podNames2, svc2IP, err := framework.StartServeHostnameService(cs, getServeHostnameService(svc2), ns, numPods)
|
||||||
|
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc2, ns)
|
||||||
|
|
||||||
hosts, err := e2essh.NodeSSHHosts(cs)
|
hosts, err := e2essh.NodeSSHHosts(cs)
|
||||||
framework.ExpectNoError(err, "failed to find external/internal IPs for every node")
|
framework.ExpectNoError(err, "failed to find external/internal IPs for every node")
|
||||||
@ -349,34 +353,34 @@ var _ = SIGDescribe("Services", func() {
|
|||||||
}
|
}
|
||||||
host := hosts[0]
|
host := hosts[0]
|
||||||
|
|
||||||
ginkgo.By("verifying service1 is up")
|
ginkgo.By("verifying service " + svc1 + " is up")
|
||||||
framework.ExpectNoError(framework.VerifyServeHostnameServiceUp(cs, ns, host, podNames1, svc1IP, servicePort))
|
framework.ExpectNoError(framework.VerifyServeHostnameServiceUp(cs, ns, host, podNames1, svc1IP, servicePort))
|
||||||
|
|
||||||
ginkgo.By("verifying service2 is up")
|
ginkgo.By("verifying service " + svc2 + " is up")
|
||||||
framework.ExpectNoError(framework.VerifyServeHostnameServiceUp(cs, ns, host, podNames2, svc2IP, servicePort))
|
framework.ExpectNoError(framework.VerifyServeHostnameServiceUp(cs, ns, host, podNames2, svc2IP, servicePort))
|
||||||
|
|
||||||
// Stop service 1 and make sure it is gone.
|
// Stop service 1 and make sure it is gone.
|
||||||
ginkgo.By("stopping service1")
|
ginkgo.By("stopping service " + svc1)
|
||||||
framework.ExpectNoError(framework.StopServeHostnameService(f.ClientSet, ns, "service1"))
|
framework.ExpectNoError(framework.StopServeHostnameService(f.ClientSet, ns, svc1))
|
||||||
|
|
||||||
ginkgo.By("verifying service1 is not up")
|
ginkgo.By("verifying service " + svc1 + " is not up")
|
||||||
framework.ExpectNoError(framework.VerifyServeHostnameServiceDown(cs, host, svc1IP, servicePort))
|
framework.ExpectNoError(framework.VerifyServeHostnameServiceDown(cs, host, svc1IP, servicePort))
|
||||||
ginkgo.By("verifying service2 is still up")
|
ginkgo.By("verifying service " + svc2 + " is still up")
|
||||||
framework.ExpectNoError(framework.VerifyServeHostnameServiceUp(cs, ns, host, podNames2, svc2IP, servicePort))
|
framework.ExpectNoError(framework.VerifyServeHostnameServiceUp(cs, ns, host, podNames2, svc2IP, servicePort))
|
||||||
|
|
||||||
// Start another service and verify both are up.
|
// Start another service and verify both are up.
|
||||||
ginkgo.By("creating service3 in namespace " + ns)
|
ginkgo.By("creating service " + svc3 + " in namespace " + ns)
|
||||||
podNames3, svc3IP, err := framework.StartServeHostnameService(cs, getServeHostnameService("service3"), ns, numPods)
|
podNames3, svc3IP, err := framework.StartServeHostnameService(cs, getServeHostnameService(svc3), ns, numPods)
|
||||||
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc3IP, ns)
|
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc3, ns)
|
||||||
|
|
||||||
if svc2IP == svc3IP {
|
if svc2IP == svc3IP {
|
||||||
framework.Failf("service IPs conflict: %v", svc2IP)
|
framework.Failf("service IPs conflict: %v", svc2IP)
|
||||||
}
|
}
|
||||||
|
|
||||||
ginkgo.By("verifying service2 is still up")
|
ginkgo.By("verifying service " + svc2 + " is still up")
|
||||||
framework.ExpectNoError(framework.VerifyServeHostnameServiceUp(cs, ns, host, podNames2, svc2IP, servicePort))
|
framework.ExpectNoError(framework.VerifyServeHostnameServiceUp(cs, ns, host, podNames2, svc2IP, servicePort))
|
||||||
|
|
||||||
ginkgo.By("verifying service3 is up")
|
ginkgo.By("verifying service " + svc3 + " is up")
|
||||||
framework.ExpectNoError(framework.VerifyServeHostnameServiceUp(cs, ns, host, podNames3, svc3IP, servicePort))
|
framework.ExpectNoError(framework.VerifyServeHostnameServiceUp(cs, ns, host, podNames3, svc3IP, servicePort))
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -387,20 +391,20 @@ var _ = SIGDescribe("Services", func() {
|
|||||||
ns := f.Namespace.Name
|
ns := f.Namespace.Name
|
||||||
numPods, servicePort := 3, defaultServeHostnameServicePort
|
numPods, servicePort := 3, defaultServeHostnameServicePort
|
||||||
|
|
||||||
svc1 := "service1"
|
svc1 := "restart-proxy-1"
|
||||||
svc2 := "service2"
|
svc2 := "restart-proxy-2"
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
framework.ExpectNoError(framework.StopServeHostnameService(f.ClientSet, ns, svc1))
|
framework.ExpectNoError(framework.StopServeHostnameService(f.ClientSet, ns, svc1))
|
||||||
}()
|
}()
|
||||||
podNames1, svc1IP, err := framework.StartServeHostnameService(cs, getServeHostnameService(svc1), ns, numPods)
|
podNames1, svc1IP, err := framework.StartServeHostnameService(cs, getServeHostnameService(svc1), ns, numPods)
|
||||||
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc1IP, ns)
|
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc1, ns)
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
framework.ExpectNoError(framework.StopServeHostnameService(f.ClientSet, ns, svc2))
|
framework.ExpectNoError(framework.StopServeHostnameService(f.ClientSet, ns, svc2))
|
||||||
}()
|
}()
|
||||||
podNames2, svc2IP, err := framework.StartServeHostnameService(cs, getServeHostnameService(svc2), ns, numPods)
|
podNames2, svc2IP, err := framework.StartServeHostnameService(cs, getServeHostnameService(svc2), ns, numPods)
|
||||||
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc2IP, ns)
|
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc2, ns)
|
||||||
|
|
||||||
if svc1IP == svc2IP {
|
if svc1IP == svc2IP {
|
||||||
framework.Failf("VIPs conflict: %v", svc1IP)
|
framework.Failf("VIPs conflict: %v", svc1IP)
|
||||||
@ -443,11 +447,14 @@ var _ = SIGDescribe("Services", func() {
|
|||||||
ns := f.Namespace.Name
|
ns := f.Namespace.Name
|
||||||
numPods, servicePort := 3, 80
|
numPods, servicePort := 3, 80
|
||||||
|
|
||||||
|
svc1 := "restart-apiserver-1"
|
||||||
|
svc2 := "restart-apiserver-2"
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
framework.ExpectNoError(framework.StopServeHostnameService(f.ClientSet, ns, "service1"))
|
framework.ExpectNoError(framework.StopServeHostnameService(f.ClientSet, ns, svc1))
|
||||||
}()
|
}()
|
||||||
podNames1, svc1IP, err := framework.StartServeHostnameService(cs, getServeHostnameService("service1"), ns, numPods)
|
podNames1, svc1IP, err := framework.StartServeHostnameService(cs, getServeHostnameService(svc1), ns, numPods)
|
||||||
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc1IP, ns)
|
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc1, ns)
|
||||||
|
|
||||||
hosts, err := e2essh.NodeSSHHosts(cs)
|
hosts, err := e2essh.NodeSSHHosts(cs)
|
||||||
framework.ExpectNoError(err, "failed to find external/internal IPs for every node")
|
framework.ExpectNoError(err, "failed to find external/internal IPs for every node")
|
||||||
@ -471,10 +478,10 @@ var _ = SIGDescribe("Services", func() {
|
|||||||
|
|
||||||
// Create a new service and check if it's not reusing IP.
|
// Create a new service and check if it's not reusing IP.
|
||||||
defer func() {
|
defer func() {
|
||||||
framework.ExpectNoError(framework.StopServeHostnameService(f.ClientSet, ns, "service2"))
|
framework.ExpectNoError(framework.StopServeHostnameService(f.ClientSet, ns, svc2))
|
||||||
}()
|
}()
|
||||||
podNames2, svc2IP, err := framework.StartServeHostnameService(cs, getServeHostnameService("service2"), ns, numPods)
|
podNames2, svc2IP, err := framework.StartServeHostnameService(cs, getServeHostnameService(svc2), ns, numPods)
|
||||||
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc2IP, ns)
|
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svc2, ns)
|
||||||
|
|
||||||
if svc1IP == svc2IP {
|
if svc1IP == svc2IP {
|
||||||
framework.Failf("VIPs conflict: %v", svc1IP)
|
framework.Failf("VIPs conflict: %v", svc1IP)
|
||||||
@ -1674,25 +1681,25 @@ var _ = SIGDescribe("Services", func() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
ginkgo.It("should have session affinity work for service with type clusterIP", func() {
|
ginkgo.It("should have session affinity work for service with type clusterIP", func() {
|
||||||
svc := getServeHostnameService("service")
|
svc := getServeHostnameService("affinity-clusterip")
|
||||||
svc.Spec.Type = v1.ServiceTypeClusterIP
|
svc.Spec.Type = v1.ServiceTypeClusterIP
|
||||||
execAffinityTestForNonLBService(f, cs, svc)
|
execAffinityTestForNonLBService(f, cs, svc)
|
||||||
})
|
})
|
||||||
|
|
||||||
ginkgo.It("should be able to switch session affinity for service with type clusterIP", func() {
|
ginkgo.It("should be able to switch session affinity for service with type clusterIP", func() {
|
||||||
svc := getServeHostnameService("service")
|
svc := getServeHostnameService("affinity-clusterip-transition")
|
||||||
svc.Spec.Type = v1.ServiceTypeClusterIP
|
svc.Spec.Type = v1.ServiceTypeClusterIP
|
||||||
execAffinityTestForNonLBServiceWithTransition(f, cs, svc)
|
execAffinityTestForNonLBServiceWithTransition(f, cs, svc)
|
||||||
})
|
})
|
||||||
|
|
||||||
ginkgo.It("should have session affinity work for NodePort service", func() {
|
ginkgo.It("should have session affinity work for NodePort service", func() {
|
||||||
svc := getServeHostnameService("service")
|
svc := getServeHostnameService("affinity-nodeport")
|
||||||
svc.Spec.Type = v1.ServiceTypeNodePort
|
svc.Spec.Type = v1.ServiceTypeNodePort
|
||||||
execAffinityTestForNonLBService(f, cs, svc)
|
execAffinityTestForNonLBService(f, cs, svc)
|
||||||
})
|
})
|
||||||
|
|
||||||
ginkgo.It("should be able to switch session affinity for NodePort service", func() {
|
ginkgo.It("should be able to switch session affinity for NodePort service", func() {
|
||||||
svc := getServeHostnameService("service")
|
svc := getServeHostnameService("affinity-nodeport-transition")
|
||||||
svc.Spec.Type = v1.ServiceTypeNodePort
|
svc.Spec.Type = v1.ServiceTypeNodePort
|
||||||
execAffinityTestForNonLBServiceWithTransition(f, cs, svc)
|
execAffinityTestForNonLBServiceWithTransition(f, cs, svc)
|
||||||
})
|
})
|
||||||
@ -1702,7 +1709,7 @@ var _ = SIGDescribe("Services", func() {
|
|||||||
// L4 load balancer affinity `ClientIP` is not supported on AWS ELB.
|
// L4 load balancer affinity `ClientIP` is not supported on AWS ELB.
|
||||||
framework.SkipIfProviderIs("aws")
|
framework.SkipIfProviderIs("aws")
|
||||||
|
|
||||||
svc := getServeHostnameService("service")
|
svc := getServeHostnameService("affinity-lb-esipp")
|
||||||
svc.Spec.Type = v1.ServiceTypeLoadBalancer
|
svc.Spec.Type = v1.ServiceTypeLoadBalancer
|
||||||
svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal
|
svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal
|
||||||
execAffinityTestForLBService(f, cs, svc)
|
execAffinityTestForLBService(f, cs, svc)
|
||||||
@ -1713,7 +1720,7 @@ var _ = SIGDescribe("Services", func() {
|
|||||||
// L4 load balancer affinity `ClientIP` is not supported on AWS ELB.
|
// L4 load balancer affinity `ClientIP` is not supported on AWS ELB.
|
||||||
framework.SkipIfProviderIs("aws")
|
framework.SkipIfProviderIs("aws")
|
||||||
|
|
||||||
svc := getServeHostnameService("service")
|
svc := getServeHostnameService("affinity-lb-esipp-transition")
|
||||||
svc.Spec.Type = v1.ServiceTypeLoadBalancer
|
svc.Spec.Type = v1.ServiceTypeLoadBalancer
|
||||||
svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal
|
svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeLocal
|
||||||
execAffinityTestForLBServiceWithTransition(f, cs, svc)
|
execAffinityTestForLBServiceWithTransition(f, cs, svc)
|
||||||
@ -1724,7 +1731,7 @@ var _ = SIGDescribe("Services", func() {
|
|||||||
// L4 load balancer affinity `ClientIP` is not supported on AWS ELB.
|
// L4 load balancer affinity `ClientIP` is not supported on AWS ELB.
|
||||||
framework.SkipIfProviderIs("aws")
|
framework.SkipIfProviderIs("aws")
|
||||||
|
|
||||||
svc := getServeHostnameService("service")
|
svc := getServeHostnameService("affinity-lb")
|
||||||
svc.Spec.Type = v1.ServiceTypeLoadBalancer
|
svc.Spec.Type = v1.ServiceTypeLoadBalancer
|
||||||
svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster
|
svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster
|
||||||
execAffinityTestForLBService(f, cs, svc)
|
execAffinityTestForLBService(f, cs, svc)
|
||||||
@ -1735,7 +1742,7 @@ var _ = SIGDescribe("Services", func() {
|
|||||||
// L4 load balancer affinity `ClientIP` is not supported on AWS ELB.
|
// L4 load balancer affinity `ClientIP` is not supported on AWS ELB.
|
||||||
framework.SkipIfProviderIs("aws")
|
framework.SkipIfProviderIs("aws")
|
||||||
|
|
||||||
svc := getServeHostnameService("service")
|
svc := getServeHostnameService("affinity-lb-transition")
|
||||||
svc.Spec.Type = v1.ServiceTypeLoadBalancer
|
svc.Spec.Type = v1.ServiceTypeLoadBalancer
|
||||||
svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster
|
svc.Spec.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyTypeCluster
|
||||||
execAffinityTestForLBServiceWithTransition(f, cs, svc)
|
execAffinityTestForLBServiceWithTransition(f, cs, svc)
|
||||||
@ -1757,13 +1764,13 @@ var _ = SIGDescribe("Services", func() {
|
|||||||
// svcToggled: Created without the label then the label is toggled verifying reachability at each step.
|
// svcToggled: Created without the label then the label is toggled verifying reachability at each step.
|
||||||
|
|
||||||
ginkgo.By("creating service-disabled in namespace " + ns)
|
ginkgo.By("creating service-disabled in namespace " + ns)
|
||||||
svcDisabled := getServeHostnameService("service-disabled")
|
svcDisabled := getServeHostnameService("service-proxy-disabled")
|
||||||
svcDisabled.ObjectMeta.Labels = serviceProxyNameLabels
|
svcDisabled.ObjectMeta.Labels = serviceProxyNameLabels
|
||||||
_, svcDisabledIP, err := framework.StartServeHostnameService(cs, svcDisabled, ns, numPods)
|
_, svcDisabledIP, err := framework.StartServeHostnameService(cs, svcDisabled, ns, numPods)
|
||||||
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svcDisabledIP, ns)
|
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svcDisabledIP, ns)
|
||||||
|
|
||||||
ginkgo.By("creating service in namespace " + ns)
|
ginkgo.By("creating service in namespace " + ns)
|
||||||
svcToggled := getServeHostnameService("service")
|
svcToggled := getServeHostnameService("service-proxy-toggled")
|
||||||
podToggledNames, svcToggledIP, err := framework.StartServeHostnameService(cs, svcToggled, ns, numPods)
|
podToggledNames, svcToggledIP, err := framework.StartServeHostnameService(cs, svcToggled, ns, numPods)
|
||||||
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svcToggledIP, ns)
|
framework.ExpectNoError(err, "failed to create replication controller with service: %s in the namespace: %s", svcToggledIP, ns)
|
||||||
|
|
||||||
@ -1993,7 +2000,7 @@ var _ = SIGDescribe("ESIPP [Slow] [DisabledForLargeClusters]", func() {
|
|||||||
|
|
||||||
ginkgo.It("should work for type=LoadBalancer", func() {
|
ginkgo.It("should work for type=LoadBalancer", func() {
|
||||||
namespace := f.Namespace.Name
|
namespace := f.Namespace.Name
|
||||||
serviceName := "external-local"
|
serviceName := "external-local-lb"
|
||||||
jig := framework.NewServiceTestJig(cs, serviceName)
|
jig := framework.NewServiceTestJig(cs, serviceName)
|
||||||
|
|
||||||
svc := jig.CreateOnlyLocalLoadBalancerService(namespace, serviceName, loadBalancerCreateTimeout, true, nil)
|
svc := jig.CreateOnlyLocalLoadBalancerService(namespace, serviceName, loadBalancerCreateTimeout, true, nil)
|
||||||
@ -2031,7 +2038,7 @@ var _ = SIGDescribe("ESIPP [Slow] [DisabledForLargeClusters]", func() {
|
|||||||
|
|
||||||
ginkgo.It("should work for type=NodePort", func() {
|
ginkgo.It("should work for type=NodePort", func() {
|
||||||
namespace := f.Namespace.Name
|
namespace := f.Namespace.Name
|
||||||
serviceName := "external-local"
|
serviceName := "external-local-nodeport"
|
||||||
jig := framework.NewServiceTestJig(cs, serviceName)
|
jig := framework.NewServiceTestJig(cs, serviceName)
|
||||||
|
|
||||||
svc := jig.CreateOnlyLocalNodePortService(namespace, serviceName, true)
|
svc := jig.CreateOnlyLocalNodePortService(namespace, serviceName, true)
|
||||||
@ -2058,7 +2065,7 @@ var _ = SIGDescribe("ESIPP [Slow] [DisabledForLargeClusters]", func() {
|
|||||||
|
|
||||||
ginkgo.It("should only target nodes with endpoints", func() {
|
ginkgo.It("should only target nodes with endpoints", func() {
|
||||||
namespace := f.Namespace.Name
|
namespace := f.Namespace.Name
|
||||||
serviceName := "external-local"
|
serviceName := "external-local-nodes"
|
||||||
jig := framework.NewServiceTestJig(cs, serviceName)
|
jig := framework.NewServiceTestJig(cs, serviceName)
|
||||||
nodes := jig.GetNodes(framework.MaxNodesForEndpointsTests)
|
nodes := jig.GetNodes(framework.MaxNodesForEndpointsTests)
|
||||||
|
|
||||||
@ -2124,7 +2131,7 @@ var _ = SIGDescribe("ESIPP [Slow] [DisabledForLargeClusters]", func() {
|
|||||||
|
|
||||||
ginkgo.It("should work from pods", func() {
|
ginkgo.It("should work from pods", func() {
|
||||||
namespace := f.Namespace.Name
|
namespace := f.Namespace.Name
|
||||||
serviceName := "external-local"
|
serviceName := "external-local-pods"
|
||||||
jig := framework.NewServiceTestJig(cs, serviceName)
|
jig := framework.NewServiceTestJig(cs, serviceName)
|
||||||
nodes := jig.GetNodes(framework.MaxNodesForEndpointsTests)
|
nodes := jig.GetNodes(framework.MaxNodesForEndpointsTests)
|
||||||
|
|
||||||
@ -2174,7 +2181,7 @@ var _ = SIGDescribe("ESIPP [Slow] [DisabledForLargeClusters]", func() {
|
|||||||
|
|
||||||
ginkgo.It("should handle updates to ExternalTrafficPolicy field", func() {
|
ginkgo.It("should handle updates to ExternalTrafficPolicy field", func() {
|
||||||
namespace := f.Namespace.Name
|
namespace := f.Namespace.Name
|
||||||
serviceName := "external-local"
|
serviceName := "external-local-update"
|
||||||
jig := framework.NewServiceTestJig(cs, serviceName)
|
jig := framework.NewServiceTestJig(cs, serviceName)
|
||||||
|
|
||||||
nodes := jig.GetNodes(framework.MaxNodesForEndpointsTests)
|
nodes := jig.GetNodes(framework.MaxNodesForEndpointsTests)
|
||||||
|
Loading…
Reference in New Issue
Block a user