github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/core/secrets/createsecret_test.go (about)

     1  // Copyright 2021 Canonical Ltd.
     2  // Licensed under the LGPLv3, see LICENCE file for details.
     3  
     4  package secrets_test
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"path/filepath"
    10  	"strings"
    11  
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	"github.com/juju/juju/core/secrets"
    16  )
    17  
    18  type CreateSecretSuite struct{}
    19  
    20  var _ = gc.Suite(&CreateSecretSuite{})
    21  
    22  func (s *CreateSecretSuite) TestBadKey(c *gc.C) {
    23  	_, err := secrets.CreateSecretData([]string{"fo=bar"})
    24  	c.Assert(err, gc.ErrorMatches, `key "fo" not valid`)
    25  }
    26  
    27  func (s *CreateSecretSuite) TestKeyValues(c *gc.C) {
    28  	data, err := secrets.CreateSecretData([]string{"foo=bar", "hello=world", "goodbye#base64=world"})
    29  	c.Assert(err, jc.ErrorIsNil)
    30  	c.Assert(data, jc.DeepEquals, secrets.SecretData{
    31  		"foo":     "YmFy",
    32  		"hello":   "d29ybGQ=",
    33  		"goodbye": "world",
    34  	})
    35  }
    36  
    37  func (s *CreateSecretSuite) TestKeyContentTooLarge(c *gc.C) {
    38  	content := strings.Repeat("a", 9*1024)
    39  	_, err := secrets.CreateSecretData([]string{"foo=" + content})
    40  	c.Assert(err, gc.ErrorMatches, `secret content for key "foo" too large: 9216 bytes`)
    41  }
    42  
    43  func (s *CreateSecretSuite) TestTotalContentTooLarge(c *gc.C) {
    44  	content := strings.Repeat("a", 4*1024)
    45  	var args []string
    46  	for i := 1; i <= 20; i++ {
    47  		args = append(args, fmt.Sprintf("key%d=%s", i, content))
    48  	}
    49  	_, err := secrets.CreateSecretData(args)
    50  	c.Assert(err, gc.ErrorMatches, `secret content too large: 81920 bytes`)
    51  }
    52  
    53  func (s *CreateSecretSuite) TestSecretKeyFromFile(c *gc.C) {
    54  	content := `
    55        -----BEGIN CERTIFICATE-----
    56        MIIFYjCCA0qgAwIBAgIQKaPND9YggIG6+jOcgmpk3DANBgkqhkiG9w0BAQsFADAz
    57        MRwwGgYDVQQKExNsaW51eGNvbnRhaW5lcnMub3JnMRMwEQYDVQQDDAp0aW1AZWx3
    58        -----END CERTIFICATE-----`[1:]
    59  
    60  	dir := c.MkDir()
    61  	fileName := filepath.Join(dir, "secret-data.bin")
    62  	err := os.WriteFile(fileName, []byte(content), os.FileMode(0644))
    63  	c.Assert(err, jc.ErrorIsNil)
    64  
    65  	data, err := secrets.CreateSecretData([]string{"key1=value1", "key2#file=" + fileName})
    66  	c.Assert(err, jc.ErrorIsNil)
    67  
    68  	c.Assert(data, jc.DeepEquals, secrets.SecretData{
    69  		"key1": "dmFsdWUx",
    70  		"key2": `ICAgICAgLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCiAgICAgIE1JSUZZakNDQTBxZ0F3SUJBZ0lRS2FQTkQ5WWdnSUc2K2pPY2dtcGszREFOQmdrcWhraUc5dzBCQVFzRkFEQXoKICAgICAgTVJ3d0dnWURWUVFLRXhOc2FXNTFlR052Ym5SaGFXNWxjbk11YjNKbk1STXdFUVlEVlFRRERBcDBhVzFBWld4MwogICAgICAtLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t`,
    71  	})
    72  }
    73  
    74  func (s *CreateSecretSuite) TestYAMLFile(c *gc.C) {
    75  	data := `
    76      hello: world
    77      goodbye#base64: world
    78      another-key: !!binary |
    79        R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
    80        OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
    81        +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
    82        AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=`
    83  
    84  	dir := c.MkDir()
    85  	fileName := filepath.Join(dir, "secret.yaml")
    86  	err := os.WriteFile(fileName, []byte(data), os.FileMode(0644))
    87  	c.Assert(err, jc.ErrorIsNil)
    88  
    89  	attrs, err := secrets.ReadSecretData(fileName)
    90  	c.Assert(err, jc.ErrorIsNil)
    91  	c.Assert(attrs, jc.DeepEquals, secrets.SecretData{
    92  		"hello":       "d29ybGQ=",
    93  		"goodbye":     "world",
    94  		"another-key": `R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLCAgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=`,
    95  	})
    96  }
    97  
    98  func (s *CreateSecretSuite) TestJSONFile(c *gc.C) {
    99  	data := `{
   100      "hello": "world",
   101      "goodbye#base64": "world",
   102  }`
   103  
   104  	dir := c.MkDir()
   105  	fileName := filepath.Join(dir, "secret.json")
   106  	err := os.WriteFile(fileName, []byte(data), os.FileMode(0644))
   107  	c.Assert(err, jc.ErrorIsNil)
   108  
   109  	attrs, err := secrets.ReadSecretData(fileName)
   110  	c.Assert(err, jc.ErrorIsNil)
   111  	c.Assert(attrs, jc.DeepEquals, secrets.SecretData{
   112  		"hello":   "d29ybGQ=",
   113  		"goodbye": "world",
   114  	})
   115  }