@@ -12,8 +12,10 @@ import (
12
12
"k8s.io/apimachinery/pkg/api/errors"
13
13
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14
14
"k8s.io/apimachinery/pkg/labels"
15
+ "k8s.io/apimachinery/pkg/types"
15
16
"k8s.io/apimachinery/pkg/util/wait"
16
17
kapiv1 "k8s.io/kubernetes/pkg/api/v1"
18
+ kcontroller "k8s.io/kubernetes/pkg/controller"
17
19
e2e "k8s.io/kubernetes/test/e2e/framework"
18
20
19
21
"github.com/openshift/origin/pkg/client"
@@ -24,6 +26,7 @@ import (
24
26
)
25
27
26
28
const deploymentRunTimeout = 5 * time .Minute
29
+ const deploymentChangeTimeout = 30 * time .Second
27
30
28
31
var _ = g .Describe ("deploymentconfigs" , func () {
29
32
defer g .GinkgoRecover ()
@@ -968,4 +971,109 @@ var _ = g.Describe("deploymentconfigs", func() {
968
971
o .Expect (err ).NotTo (o .HaveOccurred ())
969
972
})
970
973
})
974
+
975
+ g .Describe ("" , func () {
976
+ dcName := "deployment-simple"
977
+ g .AfterEach (func () {
978
+ failureTrap (oc , dcName , g .CurrentGinkgoTestDescription ().Failed )
979
+ failureTrapForDetachedRCs (oc , dcName , g .CurrentGinkgoTestDescription ().Failed )
980
+ })
981
+
982
+ g .It ("should adhere to Three Laws of Controllers [Conformance]" , func () {
983
+ namespace := oc .Namespace ()
984
+ rcName := func (i int ) string { return fmt .Sprintf ("%s-%d" , dcName , i ) }
985
+
986
+ var dc * deployapi.DeploymentConfig
987
+ var rc1 * kapiv1.ReplicationController
988
+ var err error
989
+
990
+ g .By ("should create ControllerRef in RCs it creates" , func () {
991
+ dc , err = readDCFixture (simpleDeploymentFixture )
992
+ o .Expect (err ).NotTo (o .HaveOccurred ())
993
+ dc , err = oc .Client ().DeploymentConfigs (namespace ).Create (dc )
994
+ o .Expect (err ).NotTo (o .HaveOccurred ())
995
+
996
+ err = waitForLatestCondition (oc , dcName , deploymentRunTimeout , deploymentRunning )
997
+ o .Expect (err ).NotTo (o .HaveOccurred ())
998
+
999
+ rc1 , err = oc .KubeClient ().CoreV1 ().ReplicationControllers (namespace ).Get (rcName (1 ), metav1.GetOptions {})
1000
+ o .Expect (err ).NotTo (o .HaveOccurred ())
1001
+ validRef := HasValidDCControllerRef (dc , rc1 )
1002
+ o .Expect (validRef ).To (o .BeTrue ())
1003
+ })
1004
+
1005
+ err = waitForLatestCondition (oc , dcName , deploymentRunTimeout , deploymentReachedCompletion )
1006
+ o .Expect (err ).NotTo (o .HaveOccurred ())
1007
+
1008
+ g .By ("releasing RCs that no longer match its selector" , func () {
1009
+ dc , err = oc .Client ().DeploymentConfigs (namespace ).Get (dcName , metav1.GetOptions {})
1010
+ o .Expect (err ).NotTo (o .HaveOccurred ())
1011
+
1012
+ patch := []byte (fmt .Sprintf (`{"metadata": {"labels":{"openshift.io/deployment-config.name": "%s-detached"}}}` , dcName ))
1013
+ rc1 , err = oc .KubeClient ().CoreV1 ().ReplicationControllers (namespace ).Patch (rcName (1 ), types .StrategicMergePatchType , patch )
1014
+ o .Expect (err ).NotTo (o .HaveOccurred ())
1015
+
1016
+ rc1 , err = waitForRCModification (oc , namespace , rcName (1 ), deploymentChangeTimeout ,
1017
+ rc1 .GetResourceVersion (), rCConditionFromMeta (controllerRefChangeCondition (kcontroller .GetControllerOf (rc1 ))))
1018
+ o .Expect (err ).NotTo (o .HaveOccurred ())
1019
+ controllerRef := kcontroller .GetControllerOf (rc1 )
1020
+ o .Expect (controllerRef ).To (o .BeNil ())
1021
+
1022
+ dc , err = waitForDCModification (oc , namespace , dcName , deploymentChangeTimeout ,
1023
+ dc .GetResourceVersion (), func (config * deployapi.DeploymentConfig ) (bool , error ) {
1024
+ return config .Status .AvailableReplicas != dc .Status .AvailableReplicas , nil
1025
+ })
1026
+ o .Expect (err ).NotTo (o .HaveOccurred ())
1027
+ o .Expect (dc .Status .AvailableReplicas ).To (o .BeZero ())
1028
+ o .Expect (dc .Status .UnavailableReplicas ).To (o .BeZero ())
1029
+ })
1030
+
1031
+ g .By ("adopting RCs that match its selector and have no ControllerRef" , func () {
1032
+ patch := []byte (fmt .Sprintf (`{"metadata": {"labels":{"openshift.io/deployment-config.name": "%s"}}}` , dcName ))
1033
+ rc1 , err = oc .KubeClient ().CoreV1 ().ReplicationControllers (namespace ).Patch (rcName (1 ), types .StrategicMergePatchType , patch )
1034
+ o .Expect (err ).NotTo (o .HaveOccurred ())
1035
+
1036
+ rc1 , err = waitForRCModification (oc , namespace , rcName (1 ), deploymentChangeTimeout ,
1037
+ rc1 .GetResourceVersion (), rCConditionFromMeta (controllerRefChangeCondition (kcontroller .GetControllerOf (rc1 ))))
1038
+ o .Expect (err ).NotTo (o .HaveOccurred ())
1039
+ validRef := HasValidDCControllerRef (dc , rc1 )
1040
+ o .Expect (validRef ).To (o .BeTrue ())
1041
+
1042
+ dc , err = waitForDCModification (oc , namespace , dcName , deploymentChangeTimeout ,
1043
+ dc .GetResourceVersion (), func (config * deployapi.DeploymentConfig ) (bool , error ) {
1044
+ return config .Status .AvailableReplicas != dc .Status .AvailableReplicas , nil
1045
+ })
1046
+ o .Expect (err ).NotTo (o .HaveOccurred ())
1047
+ o .Expect (dc .Status .AvailableReplicas ).To (o .Equal (dc .Spec .Replicas ))
1048
+ o .Expect (dc .Status .UnavailableReplicas ).To (o .BeZero ())
1049
+ })
1050
+
1051
+ g .By ("deleting owned RCs when deleted" , func () {
1052
+ // FIXME: Add delete option when we have new client available.
1053
+ // This is working fine now because of finalizers on RCs but when GC gets fixed
1054
+ // and we remove them this will probably break and will require setting deleteOptions
1055
+ // to achieve cascade delete
1056
+ err = oc .Client ().DeploymentConfigs (namespace ).Delete (dcName )
1057
+ o .Expect (err ).NotTo (o .HaveOccurred ())
1058
+
1059
+ err = wait .PollImmediate (200 * time .Millisecond , 5 * time .Minute , func () (bool , error ) {
1060
+ pods , err := oc .KubeClient ().CoreV1 ().Pods (namespace ).List (metav1.ListOptions {})
1061
+ if err != nil {
1062
+ return false , err
1063
+ }
1064
+ return len (pods .Items ) == 0 , nil
1065
+ })
1066
+ o .Expect (err ).NotTo (o .HaveOccurred ())
1067
+
1068
+ err = wait .PollImmediate (200 * time .Millisecond , 30 * time .Second , func () (bool , error ) {
1069
+ rcs , err := oc .KubeClient ().CoreV1 ().ReplicationControllers (namespace ).List (metav1.ListOptions {})
1070
+ if err != nil {
1071
+ return false , err
1072
+ }
1073
+ return len (rcs .Items ) == 0 , nil
1074
+ })
1075
+ o .Expect (err ).NotTo (o .HaveOccurred ())
1076
+ })
1077
+ })
1078
+ })
971
1079
})
0 commit comments