github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/backups/archive_data_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package backups_test
     5  
     6  import (
     7  	"bytes"
     8  	"compress/gzip"
     9  	"io"
    10  
    11  	"github.com/juju/testing"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	"github.com/juju/juju/state/backups"
    16  	bt "github.com/juju/juju/state/backups/testing"
    17  )
    18  
    19  type archiveDataSuiteV0 struct {
    20  	testing.IsolationSuite
    21  	baseArchiveDataSuite
    22  }
    23  
    24  var _ = gc.Suite(&archiveDataSuiteV0{})
    25  var _ = gc.Suite(&archiveDataSuite{})
    26  
    27  func (s *archiveDataSuiteV0) SetUpTest(c *gc.C) {
    28  	s.IsolationSuite.SetUpTest(c)
    29  	s.baseArchiveDataSuite.setupMetadata(c, testMetadataV0)
    30  }
    31  
    32  func newArchiveFile(c *gc.C, meta *backups.Metadata) io.Reader {
    33  	files := []bt.File{
    34  		{
    35  			Name:    "var/lib/juju/tools/1.21-alpha2.1-trusty-amd64/jujud",
    36  			Content: "<some binary data goes here>",
    37  		},
    38  		{
    39  			Name:    "var/lib/juju/system-identity",
    40  			Content: "<an ssh key goes here>",
    41  		},
    42  	}
    43  	dump := []bt.File{
    44  		{
    45  			Name:  "juju",
    46  			IsDir: true,
    47  		},
    48  		{
    49  			Name:    "juju/machines.bson",
    50  			Content: "<BSON data goes here>",
    51  		},
    52  		{
    53  			Name:    "oplog.bson",
    54  			Content: "<BSON data goes here>",
    55  		},
    56  	}
    57  	var archiveFile io.Reader
    58  	var err error
    59  	if meta != nil && meta.FormatVersion == 0 {
    60  		archiveFile, err = bt.NewArchiveV0(meta, files, dump)
    61  	} else {
    62  		archiveFile, err = bt.NewArchive(meta, files, dump)
    63  	}
    64  	c.Assert(err, jc.ErrorIsNil)
    65  	return archiveFile
    66  }
    67  
    68  func (s *archiveDataSuiteV0) TestNewArchiveData(c *gc.C) {
    69  	ad := backups.NewArchiveData([]byte("<uncompressed>"))
    70  	data := ad.NewBuffer().String()
    71  
    72  	c.Check(ad.ContentDir, gc.Equals, "juju-backup")
    73  	c.Check(data, gc.Equals, "<uncompressed>")
    74  }
    75  
    76  func (s *archiveDataSuiteV0) TestNewArchiveDataReader(c *gc.C) {
    77  	ad, err := backups.NewArchiveDataReader(s.archiveFile)
    78  	c.Assert(err, jc.ErrorIsNil)
    79  	data := ad.NewBuffer().Bytes()
    80  
    81  	c.Check(ad.ContentDir, gc.Equals, "juju-backup")
    82  	c.Check(data, jc.DeepEquals, s.data)
    83  }
    84  
    85  func (s *archiveDataSuiteV0) TestNewBuffer(c *gc.C) {
    86  	ad, err := backups.NewArchiveDataReader(s.archiveFile)
    87  	c.Assert(err, jc.ErrorIsNil)
    88  	buf := ad.NewBuffer()
    89  
    90  	c.Check(buf.Bytes(), jc.DeepEquals, s.data)
    91  }
    92  
    93  func (s *archiveDataSuiteV0) TestNewBufferMultiple(c *gc.C) {
    94  	ad, err := backups.NewArchiveDataReader(s.archiveFile)
    95  	c.Assert(err, jc.ErrorIsNil)
    96  
    97  	buf1 := ad.NewBuffer()
    98  	buf2 := ad.NewBuffer()
    99  
   100  	c.Check(buf2, gc.Not(gc.Equals), buf1)
   101  	c.Check(buf2.Bytes(), jc.DeepEquals, buf1.Bytes())
   102  }
   103  
   104  func (s *archiveDataSuiteV0) TestMetadata(c *gc.C) {
   105  	ad, err := backups.NewArchiveDataReader(s.archiveFile)
   106  	c.Assert(err, jc.ErrorIsNil)
   107  
   108  	meta, err := ad.Metadata()
   109  	c.Assert(err, jc.ErrorIsNil)
   110  	c.Check(meta, jc.DeepEquals, s.meta)
   111  }
   112  
   113  func (s *archiveDataSuiteV0) TestVersionFound(c *gc.C) {
   114  	ad, err := backups.NewArchiveDataReader(s.archiveFile)
   115  	c.Assert(err, jc.ErrorIsNil)
   116  
   117  	version, err := ad.Version()
   118  	c.Assert(err, jc.ErrorIsNil)
   119  
   120  	c.Check(version, jc.DeepEquals, &s.meta.Origin.Version)
   121  }
   122  
   123  func (s *archiveDataSuiteV0) TestVersionNotFound(c *gc.C) {
   124  	archiveFile := newArchiveFile(c, nil)
   125  	ad, err := backups.NewArchiveDataReader(archiveFile)
   126  	c.Assert(err, jc.ErrorIsNil)
   127  
   128  	version, err := ad.Version()
   129  	c.Assert(err, jc.ErrorIsNil)
   130  
   131  	c.Check(version.String(), jc.DeepEquals, "1.20.0")
   132  }
   133  
   134  type baseArchiveDataSuite struct {
   135  	archiveFile *bytes.Buffer
   136  	data        []byte
   137  	meta        *backups.Metadata
   138  }
   139  
   140  const (
   141  	testMetadataV0 = `{` +
   142  		`"ID":"20140909-115934.asdf-zxcv-qwe",` +
   143  		`"Checksum":"123af2cef",` +
   144  		`"ChecksumFormat":"SHA-1, base64 encoded",` +
   145  		`"Size":10,` +
   146  		`"Stored":"0001-01-01T00:00:00Z",` +
   147  		`"Started":"2014-09-09T11:59:34Z",` +
   148  		`"Finished":"2014-09-09T12:00:34Z",` +
   149  		`"Notes":"",` +
   150  		`"Environment":"asdf-zxcv-qwe",` +
   151  		`"Machine":"0",` +
   152  		`"Hostname":"myhost",` +
   153  		`"Version":"1.21-alpha3"` +
   154  		`}` + "\n"
   155  
   156  	testMetadataV1 = `{` +
   157  		`"ID":"20140909-115934.asdf-zxcv-qwe",` +
   158  		`"FormatVersion":1,` +
   159  		`"Checksum":"123af2cef",` +
   160  		`"ChecksumFormat":"SHA-1, base64 encoded",` +
   161  		`"Size":10,` +
   162  		`"Stored":"0001-01-01T00:00:00Z",` +
   163  		`"Started":"2014-09-09T11:59:34Z",` +
   164  		`"Finished":"2014-09-09T12:00:34Z",` +
   165  		`"Notes":"",` +
   166  		`"ModelUUID":"asdf-zxcv-qwe",` +
   167  		`"Machine":"0",` +
   168  		`"Hostname":"myhost",` +
   169  		`"Version":"1.21-alpha3",` +
   170  		`"ControllerUUID":"controller-uuid",` +
   171  		`"HANodes":3,` +
   172  		`"ControllerMachineID":"10",` +
   173  		`"ControllerMachineInstanceID":"inst-10101010"` +
   174  		`}` + "\n"
   175  )
   176  
   177  func (s *baseArchiveDataSuite) setupMetadata(c *gc.C, metadata string) {
   178  	meta, err := backups.NewMetadataJSONReader(bytes.NewBufferString(metadata))
   179  	c.Assert(err, jc.ErrorIsNil)
   180  
   181  	archiveFile := newArchiveFile(c, meta)
   182  	compressed, err := io.ReadAll(archiveFile)
   183  	c.Assert(err, jc.ErrorIsNil)
   184  	gzr, err := gzip.NewReader(bytes.NewBuffer(compressed))
   185  	c.Assert(err, jc.ErrorIsNil)
   186  	data, err := io.ReadAll(gzr)
   187  	c.Assert(err, jc.ErrorIsNil)
   188  
   189  	s.archiveFile = bytes.NewBuffer(compressed)
   190  	s.data = data
   191  	s.meta = meta
   192  }
   193  
   194  type archiveDataSuite struct {
   195  	archiveDataSuiteV0
   196  }
   197  
   198  func (s *archiveDataSuite) SetUpTest(c *gc.C) {
   199  	s.archiveDataSuiteV0.SetUpTest(c)
   200  	s.setupMetadata(c, testMetadataV1)
   201  }