120 lines
3.5 KiB
Go
120 lines
3.5 KiB
Go
package nsnetworkpolicy
|
|
|
|
import (
|
|
"github.com/go-logr/logr"
|
|
"k8s.io/apimachinery/pkg/api/errors"
|
|
"k8s.io/client-go/tools/cache"
|
|
"k8s.io/client-go/util/retry"
|
|
"kubesphere.io/kubesphere/pkg/apis/network/v1alpha1"
|
|
"kubesphere.io/kubesphere/pkg/controller/network/utils"
|
|
)
|
|
|
|
const (
|
|
controllerFinalizier = "nsnp.finalizers.networking.kubesphere.io"
|
|
)
|
|
|
|
var clog logr.Logger
|
|
|
|
func (c *controller) reconcile(key string) error {
|
|
namespace, name, err := cache.SplitMetaNamespaceKey(key)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
clog = log.WithValues("name", name, "namespace", namespace)
|
|
clog.V(1).Info("---------Begin to reconcile--------")
|
|
defer clog.V(1).Info("---------Reconcile done--------")
|
|
obj, err := c.nsnpLister.NamespaceNetworkPolicies(namespace).Get(name)
|
|
if err != nil {
|
|
if errors.IsNotFound(err) {
|
|
clog.V(2).Info("Object is removed")
|
|
return nil
|
|
}
|
|
clog.Error(err, "Failed to get resource")
|
|
return err
|
|
}
|
|
stop, err := c.addOrRemoveFinalizer(obj)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if stop {
|
|
return nil
|
|
}
|
|
clog.V(2).Info("Check if we need a create or update")
|
|
ok, err := c.nsNetworkPolicyProvider.CheckExist(obj)
|
|
if err != nil {
|
|
clog.Error(err, "Failed to check exist of network policy")
|
|
return err
|
|
}
|
|
if !ok {
|
|
clog.V(1).Info("Create a new object in backend")
|
|
err = c.nsNetworkPolicyProvider.Add(obj)
|
|
if err != nil {
|
|
clog.Error(err, "Failed to create np")
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
needUpdate, err := c.nsNetworkPolicyProvider.NeedUpdate(obj)
|
|
if err != nil {
|
|
clog.Error(err, "Failed to check if object need a update")
|
|
return err
|
|
}
|
|
if needUpdate {
|
|
clog.V(1).Info("Update object in backend")
|
|
err = c.nsNetworkPolicyProvider.Update(obj)
|
|
if err != nil {
|
|
clog.Error(err, "Failed to update object")
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *controller) addOrRemoveFinalizer(obj *v1alpha1.NamespaceNetworkPolicy) (bool, error) {
|
|
if obj.ObjectMeta.DeletionTimestamp.IsZero() {
|
|
if !utils.ContainsString(obj.ObjectMeta.Finalizers, controllerFinalizier) {
|
|
clog.V(2).Info("Detect no finalizer")
|
|
obj.ObjectMeta.Finalizers = append(obj.ObjectMeta.Finalizers, controllerFinalizier)
|
|
err := retry.RetryOnConflict(retry.DefaultBackoff, func() error {
|
|
_, err := c.kubesphereClientset.NetworkV1alpha1().NamespaceNetworkPolicies(obj.Namespace).Update(obj)
|
|
return err
|
|
})
|
|
if err != nil {
|
|
clog.Error(err, "Failed to add finalizer")
|
|
return false, err
|
|
}
|
|
return false, nil
|
|
}
|
|
} else {
|
|
// The object is being deleted
|
|
if utils.ContainsString(obj.ObjectMeta.Finalizers, controllerFinalizier) {
|
|
// our finalizer is present, so lets handle any external dependency
|
|
if err := c.deleteProviderNSNP(obj); err != nil {
|
|
// if fail to delete the external dependency here, return with error
|
|
// so that it can be retried
|
|
return false, err
|
|
}
|
|
clog.V(2).Info("Removing finalizer")
|
|
// remove our finalizer from the list and update it.
|
|
obj.ObjectMeta.Finalizers = utils.RemoveString(obj.ObjectMeta.Finalizers, controllerFinalizier)
|
|
err := retry.RetryOnConflict(retry.DefaultBackoff, func() error {
|
|
_, err := c.kubesphereClientset.NetworkV1alpha1().NamespaceNetworkPolicies(obj.Namespace).Update(obj)
|
|
return err
|
|
})
|
|
if err != nil {
|
|
clog.Error(err, "Failed to remove finalizer")
|
|
return false, err
|
|
}
|
|
return true, nil
|
|
}
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
// deleteProviderNSNP delete network policy in the backend
|
|
func (c *controller) deleteProviderNSNP(obj *v1alpha1.NamespaceNetworkPolicy) error {
|
|
clog.V(2).Info("Deleting backend network policy")
|
|
return c.nsNetworkPolicyProvider.Delete(obj)
|
|
}
|