support clean up the notification configure when delete cluster (#5077)

This commit is contained in:
wanjunlei
2022-07-20 19:27:51 +08:00
committed by GitHub
parent 03da05dd91
commit a2059725dd
53 changed files with 3754 additions and 384 deletions

View File

@@ -89,6 +89,10 @@ const (
// mulitcluster configuration name
configzMultiCluster = "multicluster"
NotificationCleanup = "notification.kubesphere.io/cleanup"
notificationAPIFormat = "%s/apis/notification.kubesphere.io/v2beta2/%s/%s"
secretAPIFormat = "%s/api/v1/namespaces/%s/secrets/%s"
)
// Cluster template for reconcile host cluster if there is none.
@@ -347,6 +351,14 @@ func (c *clusterController) syncCluster(key string) error {
klog.Errorf("Failed to sync cluster members for %s: %v", name, err)
return err
}
if cluster.Annotations[NotificationCleanup] == "true" {
if err := c.cleanupNotification(cluster); err != nil {
klog.Errorf("Failed to cleanup notification config in cluster %s: %v", name, err)
return err
}
}
// remove our cluster finalizer
finalizers := sets.NewString(cluster.ObjectMeta.Finalizers...)
finalizers.Delete(clusterv1alpha1.Finalizer)
@@ -839,3 +851,110 @@ func (c *clusterController) syncClusterMembers(clusterClient *kubernetes.Clients
}
return nil
}
func (c *clusterController) cleanupNotification(cluster *clusterv1alpha1.Cluster) error {
clusterConfig, err := clientcmd.RESTConfigFromKubeConfig(cluster.Spec.Connection.KubeConfig)
if err != nil {
return fmt.Errorf("failed to create cluster config for %s: %s", cluster.Name, err)
}
proxyTransport, err := rest.TransportFor(clusterConfig)
if err != nil {
return fmt.Errorf("failed to create proxy transport for %s: %s", cluster.Name, err)
}
client := http.Client{
Transport: proxyTransport,
Timeout: 5 * time.Second,
}
doDelete := func(kind, name string) error {
url := fmt.Sprintf(notificationAPIFormat, clusterConfig.Host, kind, name)
req, err := http.NewRequest(http.MethodDelete, url, nil)
if err != nil {
return err
}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusNotFound {
return fmt.Errorf("failed to delete notification %s %s in cluster %s, %s", kind, name, cluster.Name, resp.Status)
}
return nil
}
if fedConfigs, err := c.ksClient.TypesV1beta2().FederatedNotificationConfigs().List(context.Background(), metav1.ListOptions{}); err != nil {
return err
} else {
for _, fedConfig := range fedConfigs.Items {
if err := doDelete("configs", fedConfig.Name); err != nil {
return err
}
}
}
if fedReceivers, err := c.ksClient.TypesV1beta2().FederatedNotificationReceivers().List(context.Background(), metav1.ListOptions{}); err != nil {
return err
} else {
for _, fedReceiver := range fedReceivers.Items {
if err := doDelete("receivers", fedReceiver.Name); err != nil {
return err
}
}
}
if fedRouters, err := c.ksClient.TypesV1beta2().FederatedNotificationRouters().List(context.Background(), metav1.ListOptions{}); err != nil {
return err
} else {
for _, fedRouter := range fedRouters.Items {
if err := doDelete("routers", fedRouter.Name); err != nil {
return err
}
}
}
if fedSilences, err := c.ksClient.TypesV1beta2().FederatedNotificationSilences().List(context.Background(), metav1.ListOptions{}); err != nil {
return err
} else {
for _, fedSilence := range fedSilences.Items {
if err := doDelete("silences", fedSilence.Name); err != nil {
return err
}
}
}
selector := metav1.LabelSelector{
MatchLabels: map[string]string{
constants.NotificationManagedLabel: "true",
},
}
if secrets, err := c.k8sClient.CoreV1().Secrets(constants.NotificationSecretNamespace).List(context.Background(), metav1.ListOptions{LabelSelector: metav1.FormatLabelSelector(&selector)}); err != nil {
return err
} else {
for _, secret := range secrets.Items {
url := fmt.Sprintf(secretAPIFormat, clusterConfig.Host, constants.NotificationSecretNamespace, secret.Name)
req, err := http.NewRequest(http.MethodDelete, url, nil)
if err != nil {
return err
}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusNotFound {
return fmt.Errorf("failed to delete notification secret %s in cluster %s, %s", secret.Name, cluster.Name, resp.Status)
}
}
}
return nil
}