github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/uniter/runner/jujuc/k8s-raw-set_test.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package jujuc_test 5 6 import ( 7 "bytes" 8 "os" 9 "path/filepath" 10 11 "github.com/juju/cmd/v3" 12 "github.com/juju/cmd/v3/cmdtesting" 13 jc "github.com/juju/testing/checkers" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/worker/uniter/runner/jujuc" 17 ) 18 19 type rawK8sSpecSetSuite struct { 20 ContextSuite 21 } 22 23 var _ = gc.Suite(&rawK8sSpecSetSuite{}) 24 25 var rawPodSpecYaml = ` 26 apiVersion: apps/v1 27 kind: Deployment 28 metadata: 29 name: nginx-deployment 30 labels: 31 app: nginx 32 spec: 33 replicas: 3 34 selector: 35 matchLabels: 36 app: nginx 37 template: 38 metadata: 39 labels: 40 app: nginx 41 spec: 42 containers: 43 - name: nginx 44 image: nginx:1.14.2 45 ports: 46 - containerPort: 80 47 `[1:] 48 49 var rawK8sSpecSetInitTests = []struct { 50 args []string 51 err string 52 }{ 53 {[]string{"--file", "file", "extra"}, `unrecognized args: \["extra"\]`}, 54 } 55 56 func (s *rawK8sSpecSetSuite) TestRawK8sSpecSetInit(c *gc.C) { 57 for i, t := range rawK8sSpecSetInitTests { 58 c.Logf("test %d: %#v", i, t.args) 59 hctx := s.GetHookContext(c, -1, "") 60 com, err := jujuc.NewCommand(hctx, "k8s-raw-set") 61 c.Assert(err, jc.ErrorIsNil) 62 cmdtesting.TestInit(c, jujuc.NewJujucCommandWrappedForTest(com), t.args, t.err) 63 } 64 } 65 66 func (s *rawK8sSpecSetSuite) TestHelp(c *gc.C) { 67 hctx := s.GetHookContext(c, -1, "") 68 com, err := jujuc.NewCommand(hctx, "k8s-raw-set") 69 c.Assert(err, jc.ErrorIsNil) 70 ctx := cmdtesting.Context(c) 71 code := cmd.Main(jujuc.NewJujucCommandWrappedForTest(com), ctx, []string{"--help"}) 72 c.Assert(code, gc.Equals, 0) 73 expectedHelp := ` 74 Usage: k8s-raw-set [options] --file <core spec file> 75 76 Summary: 77 set k8s raw spec information 78 79 Options: 80 --file (= -) 81 file containing k8s raw spec 82 83 Details: 84 Sets configuration data in k8s raw format to use for k8s resources. 85 The spec applies to all units for the application. 86 `[1:] 87 88 c.Assert(bufferString(ctx.Stdout), gc.Equals, expectedHelp) 89 c.Assert(bufferString(ctx.Stderr), gc.Equals, "") 90 } 91 92 func (s *rawK8sSpecSetSuite) TestRawK8sSpecSetNoData(c *gc.C) { 93 hctx := s.GetHookContext(c, -1, "") 94 com, err := jujuc.NewCommand(hctx, "k8s-raw-set") 95 c.Assert(err, jc.ErrorIsNil) 96 ctx := cmdtesting.Context(c) 97 98 code := cmd.Main(jujuc.NewJujucCommandWrappedForTest(com), ctx, nil) 99 c.Check(code, gc.Equals, 1) 100 c.Assert(bufferString( 101 ctx.Stderr), gc.Matches, 102 ".*no k8s raw spec specified: pipe k8s raw spec to command, or specify a file with --file\n") 103 c.Assert(bufferString(ctx.Stdout), gc.Equals, "") 104 } 105 106 func (s *rawK8sSpecSetSuite) TestRawK8sSpecSet(c *gc.C) { 107 s.assertRawK8sSpecSet(c, "specfile.yaml") 108 } 109 110 func (s *rawK8sSpecSetSuite) TestRawK8sSpecSetStdIn(c *gc.C) { 111 s.assertRawK8sSpecSet(c, "-") 112 } 113 114 func (s *rawK8sSpecSetSuite) TestRawK8sSpecSetWithK8sResource(c *gc.C) { 115 s.assertRawK8sSpecSet(c, "specfile.yaml") 116 } 117 118 func (s *rawK8sSpecSetSuite) TestRawK8sSpecSetStdInWithK8sResource(c *gc.C) { 119 s.assertRawK8sSpecSet(c, "-") 120 } 121 122 func (s *rawK8sSpecSetSuite) assertRawK8sSpecSet(c *gc.C, filename string) { 123 hctx := s.GetHookContext(c, -1, "") 124 com, args, ctx := s.initCommand(c, hctx, rawPodSpecYaml, filename) 125 code := cmd.Main(jujuc.NewJujucCommandWrappedForTest(com), ctx, args) 126 c.Check(code, gc.Equals, 0) 127 c.Assert(bufferString(ctx.Stderr), gc.Equals, "") 128 c.Assert(bufferString(ctx.Stdout), gc.Equals, "") 129 expectedSpecYaml := rawPodSpecYaml 130 c.Assert(hctx.info.RawK8sSpec, gc.Equals, expectedSpecYaml) 131 } 132 133 func (s *rawK8sSpecSetSuite) initCommand(c *gc.C, hctx jujuc.Context, yaml string, filename string) (cmd.Command, []string, *cmd.Context) { 134 com, err := jujuc.NewCommand(hctx, "k8s-raw-set") 135 c.Assert(err, jc.ErrorIsNil) 136 ctx := cmdtesting.Context(c) 137 138 var args []string 139 if filename == "-" { 140 ctx.Stdin = bytes.NewBufferString(yaml) 141 } else if filename != "" { 142 filename = filepath.Join(c.MkDir(), filename) 143 err := os.WriteFile(filename, []byte(yaml), 0644) 144 c.Assert(err, jc.ErrorIsNil) 145 args = append(args, "--file", filename) 146 } 147 return jujuc.NewJujucCommandWrappedForTest(com), args, ctx 148 }