@@ -18,6 +18,8 @@ import (
|
||||
"k8s.io/klog"
|
||||
devopsv1alpha3 "kubesphere.io/kubesphere/pkg/apis/devops/v1alpha3"
|
||||
"kubesphere.io/kubesphere/pkg/client/clientset/versioned/scheme"
|
||||
tenantv1alpha1informers "kubesphere.io/kubesphere/pkg/client/informers/externalversions/tenant/v1alpha1"
|
||||
tenantv1alpha1listers "kubesphere.io/kubesphere/pkg/client/listers/tenant/v1alpha1"
|
||||
"kubesphere.io/kubesphere/pkg/constants"
|
||||
devopsClient "kubesphere.io/kubesphere/pkg/simple/client/devops"
|
||||
"kubesphere.io/kubesphere/pkg/utils/k8sutil"
|
||||
@@ -48,6 +50,9 @@ type Controller struct {
|
||||
namespaceLister corev1lister.NamespaceLister
|
||||
namespaceSynced cache.InformerSynced
|
||||
|
||||
workspaceLister tenantv1alpha1listers.WorkspaceLister
|
||||
workspaceSynced cache.InformerSynced
|
||||
|
||||
workqueue workqueue.RateLimitingInterface
|
||||
|
||||
workerLoopPeriod time.Duration
|
||||
@@ -59,7 +64,8 @@ func NewController(client clientset.Interface,
|
||||
kubesphereClient kubesphereclient.Interface,
|
||||
devopsClinet devopsClient.Interface,
|
||||
namespaceInformer corev1informer.NamespaceInformer,
|
||||
devopsInformer devopsinformers.DevOpsProjectInformer) *Controller {
|
||||
devopsInformer devopsinformers.DevOpsProjectInformer,
|
||||
workspaceInformer tenantv1alpha1informers.WorkspaceInformer) *Controller {
|
||||
|
||||
broadcaster := record.NewBroadcaster()
|
||||
broadcaster.StartLogging(func(format string, args ...interface{}) {
|
||||
@@ -77,6 +83,8 @@ func NewController(client clientset.Interface,
|
||||
devOpsProjectSynced: devopsInformer.Informer().HasSynced,
|
||||
namespaceLister: namespaceInformer.Lister(),
|
||||
namespaceSynced: namespaceInformer.Informer().HasSynced,
|
||||
workspaceLister: workspaceInformer.Lister(),
|
||||
workspaceSynced: workspaceInformer.Informer().HasSynced,
|
||||
workerLoopPeriod: time.Second,
|
||||
}
|
||||
|
||||
@@ -163,7 +171,7 @@ func (c *Controller) Run(workers int, stopCh <-chan struct{}) error {
|
||||
klog.Info("starting devops project controller")
|
||||
defer klog.Info("shutting down devops project controller")
|
||||
|
||||
if !cache.WaitForCacheSync(stopCh, c.devOpsProjectSynced) {
|
||||
if !cache.WaitForCacheSync(stopCh, c.devOpsProjectSynced, c.devOpsProjectSynced, c.workspaceSynced) {
|
||||
return fmt.Errorf("failed to wait for caches to sync")
|
||||
}
|
||||
|
||||
@@ -273,12 +281,18 @@ func (c *Controller) syncHandler(key string) error {
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(copyProject, project) {
|
||||
_, err := c.kubesphereClient.DevopsV1alpha3().DevOpsProjects().Update(copyProject)
|
||||
copyProject, err = c.kubesphereClient.DevopsV1alpha3().DevOpsProjects().Update(copyProject)
|
||||
if err != nil {
|
||||
klog.V(8).Info(err, fmt.Sprintf("failed to update ns %s ", key))
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if copyProject, err = c.bindWorkspace(copyProject); err != nil {
|
||||
klog.Error(err)
|
||||
return err
|
||||
}
|
||||
|
||||
// Check project exists, otherwise we will create it.
|
||||
_, err := c.devopsClient.GetDevOpsProject(copyProject.Status.AdminNamespace)
|
||||
if err != nil {
|
||||
@@ -312,6 +326,38 @@ func (c *Controller) syncHandler(key string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Controller) bindWorkspace(project *devopsv1alpha3.DevOpsProject) (*devopsv1alpha3.DevOpsProject, error) {
|
||||
|
||||
workspaceName := project.Labels[constants.WorkspaceLabelKey]
|
||||
|
||||
if workspaceName == "" {
|
||||
return project, nil
|
||||
}
|
||||
|
||||
workspace, err := c.workspaceLister.Get(workspaceName)
|
||||
|
||||
if err != nil {
|
||||
// skip if workspace not found
|
||||
if errors.IsNotFound(err) {
|
||||
return project, nil
|
||||
}
|
||||
klog.Error(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if !metav1.IsControlledBy(project, workspace) {
|
||||
project.OwnerReferences = nil
|
||||
if err := controllerutil.SetControllerReference(workspace, project, scheme.Scheme); err != nil {
|
||||
klog.Error(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return c.kubesphereClient.DevopsV1alpha3().DevOpsProjects().Update(project)
|
||||
}
|
||||
|
||||
return project, nil
|
||||
}
|
||||
|
||||
func (c *Controller) deleteDevOpsProjectInDevOps(project *devopsv1alpha3.DevOpsProject) error {
|
||||
|
||||
err := c.devopsClient.DeleteDevOpsProject(project.Status.AdminNamespace)
|
||||
@@ -330,9 +376,16 @@ func (c *Controller) generateNewNamespace(project *devopsv1alpha3.DevOpsProject)
|
||||
},
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
GenerateName: project.Name,
|
||||
Labels: map[string]string{constants.DevOpsProjectLabelKey: project.Name},
|
||||
Labels: map[string]string{
|
||||
constants.DevOpsProjectLabelKey: project.Name,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if creator := project.Annotations[constants.CreatorAnnotationKey]; creator != "" {
|
||||
ns.Annotations = map[string]string{constants.CreatorAnnotationKey: creator}
|
||||
}
|
||||
|
||||
controllerutil.SetControllerReference(project, ns, scheme.Scheme)
|
||||
return ns
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user