support clean up the notification configure when delete cluster (#5077)
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user