github.com/deiscc/workflow-e2e@v0.0.0-20181208071258-117299af888f/tests/limits_test.go (about) 1 package tests 2 3 import ( 4 "fmt" 5 6 "github.com/deiscc/workflow-e2e/tests/cmd" 7 "github.com/deiscc/workflow-e2e/tests/cmd/apps" 8 "github.com/deiscc/workflow-e2e/tests/cmd/auth" 9 "github.com/deiscc/workflow-e2e/tests/cmd/builds" 10 "github.com/deiscc/workflow-e2e/tests/model" 11 "github.com/deiscc/workflow-e2e/tests/settings" 12 13 . "github.com/onsi/ginkgo" 14 . "github.com/onsi/gomega" 15 . "github.com/onsi/gomega/gbytes" 16 . "github.com/onsi/gomega/gexec" 17 18 "strings" 19 ) 20 21 var _ = Describe("deis limits", func() { 22 23 Context("with an existing user", func() { 24 25 var user model.User 26 27 BeforeEach(func() { 28 user = auth.RegisterAndLogin() 29 }) 30 31 AfterEach(func() { 32 auth.Cancel(user) 33 }) 34 35 Context("who owns an existing app that has already been deployed", func() { 36 37 var app model.App 38 39 BeforeEach(func() { 40 app = apps.Create(user, "--no-remote") 41 builds.Create(user, app) 42 }) 43 44 AfterEach(func() { 45 apps.Destroy(user, app) 46 }) 47 48 Specify("that user can list that app's limits", func() { 49 sess, err := cmd.Start("deis limits:list -a %s", &user, app.Name) 50 Eventually(sess).Should(Say(fmt.Sprintf("=== %s Limits", app.Name))) 51 Eventually(sess).Should(Say("--- Memory\nUnlimited")) 52 Eventually(sess).Should(Say("--- CPU\nUnlimited")) 53 Expect(err).NotTo(HaveOccurred()) 54 Eventually(sess).Should(Exit(0)) 55 }) 56 57 Specify("that user can set a memory limit on that application", func() { 58 sess, err := cmd.Start("deis limits:set cmd=64M -a %s", &user, app.Name) 59 Eventually(sess, settings.MaxEventuallyTimeout).Should(Say("--- Memory\ncmd 64M")) 60 Expect(err).NotTo(HaveOccurred()) 61 Eventually(sess).Should(Exit(0)) 62 63 // Check that --memory also works 64 // 128M 65 sess, err = cmd.Start("deis limits:set --memory cmd=128M -a %s", &user, app.Name) 66 Eventually(sess, settings.MaxEventuallyTimeout).Should(Say("--- Memory\ncmd 128M")) 67 Expect(err).NotTo(HaveOccurred()) 68 Eventually(sess).Should(Exit(0)) 69 70 // Check Kubernetes pods manifest 71 sess, err = cmd.Start("HOME=%s kubectl get --all-namespaces pods -l app=%s --sort-by='.status.startTime' -o jsonpath={.items[*].spec.containers[0].resources}", nil, settings.ActualHome, app.Name) 72 Eventually(sess).Should(Exit(0)) 73 Expect(err).NotTo(HaveOccurred()) 74 resource := string(sess.Out.Contents()) 75 // try to get test latest pod, in case cmd still see terminated pod. 76 // Also as per bug in https://github.com/kubernetes/kubernetes/issues/16707 77 if strings.Contains(resource, "] map[") { 78 resource = resource[strings.Index(resource, "] map[")+len("] "):] 79 } 80 Expect(resource).Should(SatisfyAny( 81 Equal("map[requests:map[memory:128Mi] limits:map[memory:128Mi]]"), 82 Equal("map[limits:map[memory:128Mi] requests:map[memory:128Mi]]"))) 83 84 // 0/100M 85 sess, err = cmd.Start("deis limits:set cmd=0/100M -a %s", &user, app.Name) 86 Eventually(sess, settings.MaxEventuallyTimeout).Should(Say("--- Memory\ncmd 0/100M")) 87 Expect(err).NotTo(HaveOccurred()) 88 Eventually(sess).Should(Exit(0)) 89 90 // Check Kubernetes pods manifest 91 sess, err = cmd.Start("HOME=%s kubectl get --all-namespaces pods -l app=%s --sort-by='.status.startTime' -o jsonpath={.items[*].spec.containers[0].resources}", nil, settings.ActualHome, app.Name) 92 Eventually(sess).Should(Exit(0)) 93 Expect(err).NotTo(HaveOccurred()) 94 resource = string(sess.Out.Contents()) 95 // try to get test latest pod, in case cmd still see terminated pod. 96 if strings.Contains(resource, "] map[") { 97 resource = resource[strings.Index(resource, "] map[")+len("] "):] 98 } 99 Expect(resource).Should(SatisfyAny( 100 Equal("map[requests:map[memory:0] limits:map[memory:100Mi]]"), 101 Equal("map[limits:map[memory:100Mi] requests:map[memory:0]]"))) 102 103 // 50/100MB 104 sess, err = cmd.Start("deis limits:set cmd=50M/100MB -a %s", &user, app.Name) 105 Eventually(sess, settings.MaxEventuallyTimeout).Should(Say("--- Memory\ncmd 50M/100M")) 106 Expect(err).NotTo(HaveOccurred()) 107 Eventually(sess).Should(Exit(0)) 108 109 // Check Kubernetes pods manifest 110 sess, err = cmd.Start("HOME=%s kubectl get --all-namespaces pods -l app=%s --sort-by='.status.startTime' -o jsonpath={.items[*].spec.containers[0].resources}", nil, settings.ActualHome, app.Name) 111 Eventually(sess).Should(Exit(0)) 112 Expect(err).NotTo(HaveOccurred()) 113 resource = string(sess.Out.Contents()) 114 // try to get test latest pod, in case cmd still see terminated pod. 115 if strings.Contains(resource, "] map[") { 116 resource = resource[strings.Index(resource, "] map[")+len("] "):] 117 } 118 Expect(resource).Should(SatisfyAny( 119 Equal("map[requests:map[memory:50Mi] limits:map[memory:100Mi]]"), 120 Equal("map[limits:map[memory:100Mi] requests:map[memory:50Mi]]"))) 121 }) 122 123 Specify("that user can set a CPU limit on that application", func() { 124 sess, err := cmd.Start("deis limits:set --cpu cmd=500m -a %s", &user, app.Name) 125 Eventually(sess, settings.MaxEventuallyTimeout).Should(Say("--- CPU\ncmd 500m")) 126 Expect(err).NotTo(HaveOccurred()) 127 Eventually(sess).Should(Exit(0)) 128 129 // Check Kubernetes pods manifest 130 sess, err = cmd.Start("HOME=%s kubectl get --all-namespaces pods -l app=%s --sort-by='.status.startTime' -o jsonpath={.items[*].spec.containers[0].resources}", nil, settings.ActualHome, app.Name) 131 Eventually(sess).Should(Exit(0)) 132 Expect(err).NotTo(HaveOccurred()) 133 resource := string(sess.Out.Contents()) 134 // try to get test latest pod, in case cmd still see terminated pod. 135 if strings.Contains(resource, "] map[") { 136 resource = resource[strings.Index(resource, "] map[")+len("] "):] 137 } 138 Expect(resource).Should(SatisfyAny( 139 Equal("map[requests:map[cpu:500m] limits:map[cpu:500m]]"), 140 Equal("map[limits:map[cpu:500m] requests:map[cpu:500m]]"))) 141 }) 142 143 Specify("that user can unset a memory limit on that application", func() { 144 // no memory has been set 145 sess, err := cmd.Start("deis limits:unset cmd -a %s", &user, app.Name) 146 Expect(err).NotTo(HaveOccurred()) 147 Eventually(sess).Should(Exit(1)) 148 149 // Check that --memory also works 150 sess, err = cmd.Start("deis limits:set --memory cmd=64M -a %s", &user, app.Name) 151 Eventually(sess, settings.MaxEventuallyTimeout).Should(Say("--- Memory\ncmd 64M")) 152 Expect(err).NotTo(HaveOccurred()) 153 Eventually(sess).Should(Exit(0)) 154 sess, err = cmd.Start("deis limits:unset --memory cmd -a %s", &user, app.Name) 155 Eventually(sess, settings.MaxEventuallyTimeout).Should(Say("--- Memory\nUnlimited")) 156 Expect(err).NotTo(HaveOccurred()) 157 Eventually(sess).Should(Exit(0)) 158 159 // Check Kubernetes pods manifest 160 sess, err = cmd.Start("HOME=%s kubectl get --all-namespaces pods -l app=%s -o jsonpath={.items[*].spec.containers[0].resources}", nil, settings.ActualHome, app.Name) 161 Eventually(sess).Should(Exit(0)) 162 Expect(err).NotTo(HaveOccurred()) 163 // At least 1 pod have empty resources 164 Expect(string(sess.Out.Contents())).Should(ContainSubstring("map[]")) 165 }) 166 167 Specify("that user can unset a CPU limit on that application", func() { 168 // no cpu has been set 169 sess, err := cmd.Start("deis limits:unset --cpu cmd -a %s", &user, app.Name) 170 Expect(err).NotTo(HaveOccurred()) 171 Eventually(sess).Should(Exit(1)) 172 }) 173 174 }) 175 176 }) 177 178 })