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  }