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  })