Skip to content

Commit

Permalink
fix: not delete imageNamespaces and chartGroups when deleting projects
Browse files Browse the repository at this point in the history
  • Loading branch information
defydahui authored and choujimmy committed Dec 15, 2019
1 parent e5e4d23 commit 4963308
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 15 deletions.
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,10 @@ require (
github.com/onsi/gomega v1.5.0
github.com/opencontainers/go-digest v1.0.0-rc1 // indirect
github.com/opencontainers/image-spec v1.0.1 // indirect
github.com/openzipkin/zipkin-go v0.2.2 // indirect
github.com/parnurzeal/gorequest v0.2.15
github.com/pborman/uuid v1.2.0
github.com/pierrec/lz4 v2.0.5+incompatible // indirect
github.com/pkg/errors v0.8.1
github.com/pkg/sftp v1.10.0
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 // indirect
Expand Down
8 changes: 8 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ github.com/emicklei/go-restful v2.6.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT
github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/emicklei/go-restful v2.9.6+incompatible h1:tfrHha8zJ01ywiOEC1miGY8st1/igzWB8OmvPgoYX7w=
github.com/emicklei/go-restful v2.9.6+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
github.com/evanphx/json-patch v4.1.0+incompatible h1:K1MDoo4AZ4wU0GIU/fPmtZg7VpzLjCxu+UwBD1FvwOc=
github.com/evanphx/json-patch v4.1.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I=
Expand Down Expand Up @@ -305,6 +306,7 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
Expand Down Expand Up @@ -509,6 +511,7 @@ github.com/lib/pq v0.0.0-20181016162627-9eb73efc1fcc/go.mod h1:5WUZQaWbwv1U+lTRe
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lightstep/lightstep-tracer-go v0.15.6/go.mod h1:6AMpwZpsyCFwSovxzM78e+AsYxE8sGwiM6C3TytaWeI=
github.com/lovoo/gcloud-opentracing v0.3.0/go.mod h1:ZFqk2y38kMDDikZPAK7ynTTGuyt17nSPdS3K5e+ZTBY=
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
Expand Down Expand Up @@ -592,6 +595,7 @@ github.com/opentracing-contrib/go-stdlib v0.0.0-20170113013457-1de4cc2120e7/go.m
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
github.com/oracle/oci-go-sdk v5.14.0+incompatible h1:RL/BN87saea2/iGFCT3jmr+IK420DFuSDQ233fdz6fM=
github.com/oracle/oci-go-sdk v5.14.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888=
github.com/parnurzeal/gorequest v0.2.15 h1:oPjDCsF5IkD4gUk6vIgsxYNaSgvAnIh1EJeROn3HdJU=
Expand All @@ -605,10 +609,12 @@ github.com/peterbourgon/diskv v0.0.0-20180312054125-0646ccaebea1/go.mod h1:uqqh8
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/peterbourgon/g2s v0.0.0-20170223122336-d4e7ad98afea/go.mod h1:1VcHEd3ro4QMoHfiNl/j7Jkln9+KQuorp0PItHMJYNg=
github.com/petermattis/goid v0.0.0-20170504144140-0ded85884ba5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
github.com/pkg/sftp v1.10.0 h1:DGA1KlA9esU6WcicH+P8PxFZOl15O6GYtab1cIJdOlE=
github.com/pkg/sftp v1.10.0/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk=
github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
Expand Down Expand Up @@ -721,6 +727,7 @@ github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M=
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
Expand Down Expand Up @@ -935,6 +942,7 @@ google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmE
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -243,8 +243,10 @@ func (d *projectedResourcesDeleter) finalizeProject(project *businessv1.Project)
type deleteResourceFunc func(deleter *projectedResourcesDeleter, project *businessv1.Project) error

var deleteResourceFuncs = []deleteResourceFunc{
deleteNamespace,
deleteChildProject,
deleteChartGroups,
deleteImageNamespaces,
deleteNamespaces,
deleteChildProjects,
recalculateParentProjectUsed,
}

Expand Down Expand Up @@ -297,8 +299,8 @@ func recalculateParentProjectUsed(deleter *projectedResourcesDeleter, project *b
return nil
}

func deleteChildProject(deleter *projectedResourcesDeleter, project *businessv1.Project) error {
log.Debug("Project controller - deleteChildProject", log.String("projectName", project.ObjectMeta.Name))
func deleteChildProjects(deleter *projectedResourcesDeleter, project *businessv1.Project) error {
log.Debug("Project controller - deleteChildProjects", log.String("projectName", project.ObjectMeta.Name))

childProjectList, err := deleter.businessClient.Projects().List(metav1.ListOptions{
FieldSelector: fields.OneTermEqualSelector("spec.parentProjectName", project.ObjectMeta.Name).String(),
Expand All @@ -318,26 +320,71 @@ func deleteChildProject(deleter *projectedResourcesDeleter, project *businessv1.
return nil
}

func deleteNamespace(deleter *projectedResourcesDeleter, project *businessv1.Project) error {
log.Debug("Project controller - deleteNamespace", log.String("projectName", project.ObjectMeta.Name))
func deleteNamespaces(deleter *projectedResourcesDeleter, project *businessv1.Project) error {
log.Debug("Project controller - deleteNamespaces", log.String("projectName", project.ObjectMeta.Name))

childNamespaceList, err := deleter.businessClient.Namespaces(project.ObjectMeta.Name).List(metav1.ListOptions{})
namespaceList, err := deleter.businessClient.Namespaces(project.ObjectMeta.Name).List(metav1.ListOptions{})
if err != nil {
log.Error("Project controller - failed to list child namespaces", log.String("projectName", project.ObjectMeta.Name), log.Err(err))
log.Error("Project controller - failed to list namespaces", log.String("projectName", project.ObjectMeta.Name), log.Err(err))
return err
}
for _, childNamespace := range childNamespaceList.Items {
for _, namespace := range namespaceList.Items {
background := metav1.DeletePropagationBackground
deleteOpt := &metav1.DeleteOptions{PropagationPolicy: &background}
if err := deleter.businessClient.Namespaces(project.ObjectMeta.Name).Delete(childNamespace.ObjectMeta.Name, deleteOpt); err != nil {
log.Info("Project controller - failed to delete child namespace", log.String("projectName", project.ObjectMeta.Name), log.String("childNamespace", childNamespace.ObjectMeta.Name), log.Err(err))
if err := deleter.businessClient.Namespaces(project.ObjectMeta.Name).Delete(namespace.ObjectMeta.Name, deleteOpt); err != nil {
log.Info("Project controller - failed to delete namespace", log.String("projectName", project.ObjectMeta.Name), log.String("namespace", namespace.ObjectMeta.Name), log.Err(err))
}
}

return nil
}

func deleteImageNamespaces(deleter *projectedResourcesDeleter, project *businessv1.Project) error {
log.Debug("Project controller - deleteImageNamespaces", log.String("projectName", project.ObjectMeta.Name))

imageNamespaceList, err := deleter.businessClient.ImageNamespaces(project.ObjectMeta.Name).List(metav1.ListOptions{})
if err != nil {
log.Error("Project controller - failed to list imageNamespaces", log.String("projectName", project.ObjectMeta.Name), log.Err(err))
return err
}
for _, imageNamespace := range imageNamespaceList.Items {
background := metav1.DeletePropagationBackground
deleteOpt := &metav1.DeleteOptions{PropagationPolicy: &background}
if err := deleter.businessClient.ImageNamespaces(project.ObjectMeta.Name).Delete(imageNamespace.ObjectMeta.Name, deleteOpt); err != nil {
log.Info("Project controller - failed to delete imageNamespace", log.String("projectName", project.ObjectMeta.Name), log.String("imageNamespace", imageNamespace.ObjectMeta.Name), log.Err(err))
}
}

return nil
}

func deleteChartGroups(deleter *projectedResourcesDeleter, project *businessv1.Project) error {
log.Debug("Project controller - deleteChartGroups", log.String("projectName", project.ObjectMeta.Name))

chartGroupList, err := deleter.businessClient.ChartGroups(project.ObjectMeta.Name).List(metav1.ListOptions{})
if err != nil {
log.Error("Project controller - failed to list chartGroups", log.String("projectName", project.ObjectMeta.Name), log.Err(err))
return err
}
for _, chartGroup := range chartGroupList.Items {
background := metav1.DeletePropagationBackground
deleteOpt := &metav1.DeleteOptions{PropagationPolicy: &background}
if err := deleter.businessClient.ChartGroups(project.ObjectMeta.Name).Delete(chartGroup.ObjectMeta.Name, deleteOpt); err != nil {
log.Info("Project controller - failed to delete chartGroup", log.String("projectName", project.ObjectMeta.Name), log.String("chartGroup", chartGroup.ObjectMeta.Name), log.Err(err))
}
}

return nil
}

func (d *projectedResourcesDeleter) hasAllChildrenDeleted(project *businessv1.Project) bool {
return d.hasAllChildProjectsDeleted(project) &&
d.hasAllNamespacesDeleted(project) &&
d.hasAllImageNamespacesDeleted(project) &&
d.hasAllChartGroupsDeleted(project)
}

func (d *projectedResourcesDeleter) hasAllChildProjectsDeleted(project *businessv1.Project) bool {
childProjectList, err := d.businessClient.Projects().List(metav1.ListOptions{
FieldSelector: fields.OneTermEqualSelector("spec.parentProjectName", project.ObjectMeta.Name).String(),
})
Expand All @@ -352,13 +399,49 @@ func (d *projectedResourcesDeleter) hasAllChildrenDeleted(project *businessv1.Pr
}
}

childNamespaceList, err := d.businessClient.Namespaces(project.ObjectMeta.Name).List(metav1.ListOptions{})
return true
}

func (d *projectedResourcesDeleter) hasAllNamespacesDeleted(project *businessv1.Project) bool {
namespaceList, err := d.businessClient.Namespaces(project.ObjectMeta.Name).List(metav1.ListOptions{})
if err != nil {
log.Error("Project controller - failed to list namespaces", log.String("projectName", project.ObjectMeta.Name), log.Err(err))
return false
}
for _, namespace := range namespaceList.Items {
_, err = d.businessClient.Namespaces(project.ObjectMeta.Name).Get(namespace.ObjectMeta.Name, metav1.GetOptions{})
if err == nil || !errors.IsNotFound(err) {
return false
}
}

return true
}

func (d *projectedResourcesDeleter) hasAllImageNamespacesDeleted(project *businessv1.Project) bool {
imageNamespaceList, err := d.businessClient.ImageNamespaces(project.ObjectMeta.Name).List(metav1.ListOptions{})
if err != nil {
log.Error("Project controller - failed to list imageNamespaces", log.String("projectName", project.ObjectMeta.Name), log.Err(err))
return false
}
for _, imageNamespace := range imageNamespaceList.Items {
_, err = d.businessClient.ImageNamespaces(project.ObjectMeta.Name).Get(imageNamespace.ObjectMeta.Name, metav1.GetOptions{})
if err == nil || !errors.IsNotFound(err) {
return false
}
}

return true
}

func (d *projectedResourcesDeleter) hasAllChartGroupsDeleted(project *businessv1.Project) bool {
chartGroupList, err := d.businessClient.ChartGroups(project.ObjectMeta.Name).List(metav1.ListOptions{})
if err != nil {
log.Error("Project controller - failed to list child namespaces", log.String("projectName", project.ObjectMeta.Name), log.Err(err))
log.Error("Project controller - failed to list chartGroups", log.String("projectName", project.ObjectMeta.Name), log.Err(err))
return false
}
for _, childNamespace := range childNamespaceList.Items {
_, err = d.businessClient.Namespaces(project.ObjectMeta.Name).Get(childNamespace.ObjectMeta.Name, metav1.GetOptions{})
for _, chartGroup := range chartGroupList.Items {
_, err = d.businessClient.ChartGroups(project.ObjectMeta.Name).Get(chartGroup.ObjectMeta.Name, metav1.GetOptions{})
if err == nil || !errors.IsNotFound(err) {
return false
}
Expand Down

0 comments on commit 4963308

Please sign in to comment.