Browse code

prune: Remove deployer pods when pruning failed deployments

kargakis authored on 2015/11/04 22:38:22
Showing 7 changed files
... ...
@@ -18,6 +18,7 @@ import (
18 18
 	"github.com/openshift/origin/pkg/cmd/util/clientcmd"
19 19
 	deployapi "github.com/openshift/origin/pkg/deploy/api"
20 20
 	"github.com/openshift/origin/pkg/deploy/prune"
21
+	deployutil "github.com/openshift/origin/pkg/deploy/util"
21 22
 )
22 23
 
23 24
 const deploymentsLongDesc = `%s %s - Remove older completed and failed deployments`
... ...
@@ -89,11 +90,21 @@ func NewCmdPruneDeployments(f *clientcmd.Factory, parentName, name string, out i
89 89
 			case true:
90 90
 				deploymentPruneFunc = func(deployment *kapi.ReplicationController) error {
91 91
 					describingPruneDeploymentFunc(deployment)
92
-					err := kclient.ReplicationControllers(deployment.Namespace).Delete(deployment.Name)
93
-					if err != nil {
94
-						return err
92
+					// If the deployment is failed we need to remove its deployer pods, too.
93
+					if deployutil.DeploymentStatusFor(deployment) == deployapi.DeploymentStatusFailed {
94
+						dpSelector := deployutil.DeployerPodSelector(deployment.Name)
95
+						deployers, err := kclient.Pods(deployment.Namespace).List(dpSelector, fields.Everything())
96
+						if err != nil {
97
+							fmt.Fprintf(os.Stderr, "Cannot list deployer pods for %q: %v\n", deployment.Name, err)
98
+						} else {
99
+							for _, pod := range deployers.Items {
100
+								if err := kclient.Pods(pod.Namespace).Delete(pod.Name, nil); err != nil {
101
+									fmt.Fprintf(os.Stderr, "Cannot remove deployer pod %q: %v\n", pod.Name, err)
102
+								}
103
+							}
104
+						}
95 105
 					}
96
-					return nil
106
+					return kclient.ReplicationControllers(deployment.Namespace).Delete(deployment.Name)
97 107
 				}
98 108
 			default:
99 109
 				fmt.Fprintln(os.Stderr, "Dry run enabled - no modifications will be made. Add --confirm to remove deployments")
... ...
@@ -111,8 +111,8 @@ func (o *perDeploymentConfigResolver) Resolve() ([]*kapi.ReplicationController,
111 111
 				failedDeployments = append(failedDeployments, deployment)
112 112
 			}
113 113
 		}
114
-		sort.Sort(sortableReplicationControllers(completeDeployments))
115
-		sort.Sort(sortableReplicationControllers(failedDeployments))
114
+		sort.Sort(deployutil.ByMostRecent(completeDeployments))
115
+		sort.Sort(deployutil.ByMostRecent(failedDeployments))
116 116
 
117 117
 		if o.keepComplete >= 0 && o.keepComplete < len(completeDeployments) {
118 118
 			results = append(results, completeDeployments[o.keepComplete:]...)
... ...
@@ -11,6 +11,7 @@ import (
11 11
 	"k8s.io/kubernetes/pkg/util/sets"
12 12
 
13 13
 	deployapi "github.com/openshift/origin/pkg/deploy/api"
14
+	deployutil "github.com/openshift/origin/pkg/deploy/util"
14 15
 )
15 16
 
16 17
 type mockResolver struct {
... ...
@@ -150,8 +151,8 @@ func TestPerDeploymentConfigResolver(t *testing.T) {
150 150
 					failedDeployments = append(failedDeployments, deployment)
151 151
 				}
152 152
 			}
153
-			sort.Sort(sortableReplicationControllers(completedDeployments))
154
-			sort.Sort(sortableReplicationControllers(failedDeployments))
153
+			sort.Sort(deployutil.ByMostRecent(completedDeployments))
154
+			sort.Sort(deployutil.ByMostRecent(failedDeployments))
155 155
 			purgeCompleted := []*kapi.ReplicationController{}
156 156
 			purgeFailed := []*kapi.ReplicationController{}
157 157
 			if keep >= 0 && keep < len(completedDeployments) {
158 158
deleted file mode 100644
... ...
@@ -1,20 +0,0 @@
1
-package prune
2
-
3
-import (
4
-	kapi "k8s.io/kubernetes/pkg/api"
5
-)
6
-
7
-// sortableReplicationControllers supports sorting ReplicationController items by most recently created
8
-type sortableReplicationControllers []*kapi.ReplicationController
9
-
10
-func (s sortableReplicationControllers) Len() int {
11
-	return len(s)
12
-}
13
-
14
-func (s sortableReplicationControllers) Less(i, j int) bool {
15
-	return !s[i].CreationTimestamp.Before(s[j].CreationTimestamp)
16
-}
17
-
18
-func (s sortableReplicationControllers) Swap(i, j int) {
19
-	s[i], s[j] = s[j], s[i]
20
-}
21 1
deleted file mode 100644
... ...
@@ -1,37 +0,0 @@
1
-package prune
2
-
3
-import (
4
-	"sort"
5
-	"testing"
6
-	"time"
7
-
8
-	kapi "k8s.io/kubernetes/pkg/api"
9
-	"k8s.io/kubernetes/pkg/api/unversioned"
10
-)
11
-
12
-// TestSort verifies that builds are sorted by most recently created
13
-func TestSort(t *testing.T) {
14
-	present := unversioned.Now()
15
-	past := unversioned.NewTime(present.Time.Add(-1 * time.Minute))
16
-	controllers := []*kapi.ReplicationController{
17
-		{
18
-			ObjectMeta: kapi.ObjectMeta{
19
-				Name:              "past",
20
-				CreationTimestamp: past,
21
-			},
22
-		},
23
-		{
24
-			ObjectMeta: kapi.ObjectMeta{
25
-				Name:              "present",
26
-				CreationTimestamp: present,
27
-			},
28
-		},
29
-	}
30
-	sort.Sort(sortableReplicationControllers(controllers))
31
-	if controllers[0].Name != "present" {
32
-		t.Errorf("Unexpected sort order")
33
-	}
34
-	if controllers[1].Name != "past" {
35
-		t.Errorf("Unexpected sort order")
36
-	}
37
-}
... ...
@@ -289,3 +289,12 @@ func (d ByLatestVersionDesc) Swap(i, j int) { d[i], d[j] = d[j], d[i] }
289 289
 func (d ByLatestVersionDesc) Less(i, j int) bool {
290 290
 	return DeploymentVersionFor(&d[j]) < DeploymentVersionFor(&d[i])
291 291
 }
292
+
293
+// ByMostRecent sorts deployments by most recently created.
294
+type ByMostRecent []*api.ReplicationController
295
+
296
+func (s ByMostRecent) Len() int      { return len(s) }
297
+func (s ByMostRecent) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
298
+func (s ByMostRecent) Less(i, j int) bool {
299
+	return !s[i].CreationTimestamp.Before(s[j].CreationTimestamp)
300
+}
... ...
@@ -4,10 +4,13 @@ import (
4 4
 	"sort"
5 5
 	"strconv"
6 6
 	"testing"
7
+	"time"
8
+
9
+	kapi "k8s.io/kubernetes/pkg/api"
10
+	"k8s.io/kubernetes/pkg/api/unversioned"
7 11
 
8 12
 	deployapi "github.com/openshift/origin/pkg/deploy/api"
9 13
 	deploytest "github.com/openshift/origin/pkg/deploy/api/test"
10
-	kapi "k8s.io/kubernetes/pkg/api"
11 14
 )
12 15
 
13 16
 func podTemplateA() *kapi.PodTemplateSpec {
... ...
@@ -152,3 +155,30 @@ func TestDeploymentsByLatestVersion_sorting(t *testing.T) {
152 152
 		}
153 153
 	}
154 154
 }
155
+
156
+// TestSort verifies that builds are sorted by most recently created
157
+func TestSort(t *testing.T) {
158
+	present := unversioned.Now()
159
+	past := unversioned.NewTime(present.Time.Add(-1 * time.Minute))
160
+	controllers := []*kapi.ReplicationController{
161
+		{
162
+			ObjectMeta: kapi.ObjectMeta{
163
+				Name:              "past",
164
+				CreationTimestamp: past,
165
+			},
166
+		},
167
+		{
168
+			ObjectMeta: kapi.ObjectMeta{
169
+				Name:              "present",
170
+				CreationTimestamp: present,
171
+			},
172
+		},
173
+	}
174
+	sort.Sort(ByMostRecent(controllers))
175
+	if controllers[0].Name != "present" {
176
+		t.Errorf("Unexpected sort order")
177
+	}
178
+	if controllers[1].Name != "past" {
179
+		t.Errorf("Unexpected sort order")
180
+	}
181
+}