github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/backups/metadata_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  	"os"
     9  	"path/filepath"
    10  	"time" // Only used for time types and funcs, not Now().
    11  
    12  	"github.com/juju/errors"
    13  	jc "github.com/juju/testing/checkers"
    14  	"github.com/juju/version/v2"
    15  	gc "gopkg.in/check.v1"
    16  
    17  	"github.com/juju/juju/state/backups"
    18  	"github.com/juju/juju/testing"
    19  )
    20  
    21  type metadataSuite struct {
    22  	testing.BaseSuite
    23  }
    24  
    25  var _ = gc.Suite(&metadataSuite{}) // Register the suite.
    26  
    27  func (s *metadataSuite) TestAsJSONBuffer(c *gc.C) {
    28  	meta := s.createTestMetadata(c)
    29  	meta.FormatVersion = 0
    30  	s.assertMetadata(c, meta, `{`+
    31  		`"ID":"20140909-115934.asdf-zxcv-qwe",`+
    32  		`"FormatVersion":0,`+
    33  		`"Checksum":"123af2cef",`+
    34  		`"ChecksumFormat":"SHA-1, base64 encoded",`+
    35  		`"Size":10,`+
    36  		`"Stored":"0001-01-01T00:00:00Z",`+
    37  		`"Started":"2014-09-09T11:59:34Z",`+
    38  		`"Finished":"2014-09-09T12:00:34Z",`+
    39  		`"Notes":"",`+
    40  		`"ModelUUID":"asdf-zxcv-qwe",`+
    41  		`"Machine":"0",`+
    42  		`"Hostname":"myhost",`+
    43  		`"Version":"1.21-alpha3",`+
    44  		`"Base":"ubuntu@22.04",`+
    45  		`"ControllerUUID":"",`+
    46  		`"HANodes":0,`+
    47  		`"ControllerMachineID":"",`+
    48  		`"ControllerMachineInstanceID":""`+
    49  		`}`+"\n")
    50  }
    51  
    52  func (s *metadataSuite) createTestMetadata(c *gc.C) *backups.Metadata {
    53  	meta := backups.NewMetadata()
    54  	meta.Origin = backups.Origin{
    55  		Model:    "asdf-zxcv-qwe",
    56  		Machine:  "0",
    57  		Hostname: "myhost",
    58  		Version:  version.MustParse("1.21-alpha3"),
    59  		Base:     "ubuntu@22.04",
    60  	}
    61  	meta.Started = time.Date(2014, time.Month(9), 9, 11, 59, 34, 0, time.UTC)
    62  
    63  	meta.SetID("20140909-115934.asdf-zxcv-qwe")
    64  
    65  	return meta
    66  }
    67  
    68  func (s *metadataSuite) assertMetadata(c *gc.C, meta *backups.Metadata, expected string) {
    69  	err := meta.MarkComplete(10, "123af2cef")
    70  	c.Assert(err, jc.ErrorIsNil)
    71  	finished := meta.Started.Add(time.Minute)
    72  	meta.Finished = &finished
    73  
    74  	buf, err := meta.AsJSONBuffer()
    75  	c.Assert(err, jc.ErrorIsNil)
    76  
    77  	c.Check(buf.(*bytes.Buffer).String(), jc.DeepEquals, expected)
    78  }
    79  
    80  func (s *metadataSuite) TestAsJSONBufferV1NonHA(c *gc.C) {
    81  	meta := s.createTestMetadata(c)
    82  	meta.FormatVersion = 1
    83  	meta.Controller = backups.ControllerMetadata{
    84  		UUID:              "controller-uuid",
    85  		MachineInstanceID: "inst-10101010",
    86  		MachineID:         "10",
    87  	}
    88  	s.assertMetadata(c, meta, `{`+
    89  		`"ID":"20140909-115934.asdf-zxcv-qwe",`+
    90  		`"FormatVersion":1,`+
    91  		`"Checksum":"123af2cef",`+
    92  		`"ChecksumFormat":"SHA-1, base64 encoded",`+
    93  		`"Size":10,`+
    94  		`"Stored":"0001-01-01T00:00:00Z",`+
    95  		`"Started":"2014-09-09T11:59:34Z",`+
    96  		`"Finished":"2014-09-09T12:00:34Z",`+
    97  		`"Notes":"",`+
    98  		`"ModelUUID":"asdf-zxcv-qwe",`+
    99  		`"Machine":"0",`+
   100  		`"Hostname":"myhost",`+
   101  		`"Version":"1.21-alpha3",`+
   102  		`"Base":"ubuntu@22.04",`+
   103  		`"ControllerUUID":"controller-uuid",`+
   104  		`"HANodes":0,`+
   105  		`"ControllerMachineID":"10",`+
   106  		`"ControllerMachineInstanceID":"inst-10101010"`+
   107  		`}`+"\n")
   108  }
   109  
   110  func (s *metadataSuite) TestAsJSONBufferV1HA(c *gc.C) {
   111  	meta := s.createTestMetadata(c)
   112  	meta.FormatVersion = 1
   113  	meta.Controller = backups.ControllerMetadata{
   114  		UUID:              "controller-uuid",
   115  		MachineInstanceID: "inst-10101010",
   116  		MachineID:         "10",
   117  		HANodes:           3,
   118  	}
   119  
   120  	s.assertMetadata(c, meta, `{`+
   121  		`"ID":"20140909-115934.asdf-zxcv-qwe",`+
   122  		`"FormatVersion":1,`+
   123  		`"Checksum":"123af2cef",`+
   124  		`"ChecksumFormat":"SHA-1, base64 encoded",`+
   125  		`"Size":10,`+
   126  		`"Stored":"0001-01-01T00:00:00Z",`+
   127  		`"Started":"2014-09-09T11:59:34Z",`+
   128  		`"Finished":"2014-09-09T12:00:34Z",`+
   129  		`"Notes":"",`+
   130  		`"ModelUUID":"asdf-zxcv-qwe",`+
   131  		`"Machine":"0",`+
   132  		`"Hostname":"myhost",`+
   133  		`"Version":"1.21-alpha3",`+
   134  		`"Base":"ubuntu@22.04",`+
   135  		`"ControllerUUID":"controller-uuid",`+
   136  		`"HANodes":3,`+
   137  		`"ControllerMachineID":"10",`+
   138  		`"ControllerMachineInstanceID":"inst-10101010"`+
   139  		`}`+"\n")
   140  }
   141  
   142  func (s *metadataSuite) TestNewMetadataJSONReaderV0(c *gc.C) {
   143  	file := bytes.NewBufferString(`{` +
   144  		`"ID":"20140909-115934.asdf-zxcv-qwe",` +
   145  		`"Checksum":"123af2cef",` +
   146  		`"ChecksumFormat":"SHA-1, base64 encoded",` +
   147  		`"Size":10,` +
   148  		`"Stored":"0001-01-01T00:00:00Z",` +
   149  		`"Started":"2014-09-09T11:59:34Z",` +
   150  		`"Finished":"2014-09-09T12:00:34Z",` +
   151  		`"Notes":"",` +
   152  		`"Environment":"asdf-zxcv-qwe",` +
   153  		`"Machine":"0",` +
   154  		`"Hostname":"myhost",` +
   155  		`"Version":"1.21-alpha3"` +
   156  		`}` + "\n")
   157  	meta, err := backups.NewMetadataJSONReader(file)
   158  	c.Assert(err, jc.ErrorIsNil)
   159  
   160  	c.Check(meta.ID(), gc.Equals, "20140909-115934.asdf-zxcv-qwe")
   161  	c.Check(meta.Checksum(), gc.Equals, "123af2cef")
   162  	c.Check(meta.ChecksumFormat(), gc.Equals, "SHA-1, base64 encoded")
   163  	c.Check(meta.Size(), gc.Equals, int64(10))
   164  	c.Check(meta.Stored(), gc.IsNil)
   165  	c.Check(meta.Started.Unix(), gc.Equals, int64(1410263974))
   166  	c.Check(meta.Finished.Unix(), gc.Equals, int64(1410264034))
   167  	c.Check(meta.Notes, gc.Equals, "")
   168  	c.Check(meta.Origin.Model, gc.Equals, "asdf-zxcv-qwe")
   169  	c.Check(meta.Origin.Machine, gc.Equals, "0")
   170  	c.Check(meta.Origin.Hostname, gc.Equals, "myhost")
   171  	c.Check(meta.Origin.Version.String(), gc.Equals, "1.21-alpha3")
   172  	c.Check(meta.FormatVersion, gc.Equals, int64(0))
   173  	c.Check(meta.Controller.UUID, gc.Equals, "")
   174  	c.Check(meta.Controller.HANodes, gc.Equals, int64(0))
   175  	c.Check(meta.Controller.MachineInstanceID, gc.Equals, "")
   176  	c.Check(meta.Controller.MachineID, gc.Equals, "")
   177  }
   178  
   179  func (s *metadataSuite) TestNewMetadataJSONReaderV1(c *gc.C) {
   180  	file := bytes.NewBufferString(`{` +
   181  		`"ID":"20140909-115934.asdf-zxcv-qwe",` +
   182  		`"FormatVersion":1,` +
   183  		`"Checksum":"123af2cef",` +
   184  		`"ChecksumFormat":"SHA-1, base64 encoded",` +
   185  		`"Size":10,` +
   186  		`"Stored":"0001-01-01T00:00:00Z",` +
   187  		`"Started":"2014-09-09T11:59:34Z",` +
   188  		`"Finished":"2014-09-09T12:00:34Z",` +
   189  		`"Notes":"",` +
   190  		`"ModelUUID":"asdf-zxcv-qwe",` +
   191  		`"Machine":"0",` +
   192  		`"Hostname":"myhost",` +
   193  		`"Version":"1.21-alpha3",` +
   194  		`"ControllerUUID":"controller-uuid",` +
   195  		`"HANodes":3,` +
   196  		`"ControllerMachineID":"10",` +
   197  		`"ControllerMachineInstanceID":"inst-10101010"` +
   198  		`}` + "\n")
   199  	meta, err := backups.NewMetadataJSONReader(file)
   200  	c.Assert(err, jc.ErrorIsNil)
   201  
   202  	c.Check(meta.ID(), gc.Equals, "20140909-115934.asdf-zxcv-qwe")
   203  	c.Check(meta.Checksum(), gc.Equals, "123af2cef")
   204  	c.Check(meta.ChecksumFormat(), gc.Equals, "SHA-1, base64 encoded")
   205  	c.Check(meta.Size(), gc.Equals, int64(10))
   206  	c.Check(meta.Stored(), gc.IsNil)
   207  	c.Check(meta.Started.Unix(), gc.Equals, int64(1410263974))
   208  	c.Check(meta.Finished.Unix(), gc.Equals, int64(1410264034))
   209  	c.Check(meta.Notes, gc.Equals, "")
   210  	c.Check(meta.Origin.Model, gc.Equals, "asdf-zxcv-qwe")
   211  	c.Check(meta.Origin.Machine, gc.Equals, "0")
   212  	c.Check(meta.Origin.Hostname, gc.Equals, "myhost")
   213  	c.Check(meta.Origin.Version.String(), gc.Equals, "1.21-alpha3")
   214  	c.Check(meta.FormatVersion, gc.Equals, int64(1))
   215  	c.Check(meta.Controller.UUID, gc.Equals, "controller-uuid")
   216  	c.Check(meta.Controller.HANodes, gc.Equals, int64(3))
   217  	c.Check(meta.Controller.MachineInstanceID, gc.Equals, "inst-10101010")
   218  	c.Check(meta.Controller.MachineID, gc.Equals, "10")
   219  }
   220  
   221  func (s *metadataSuite) TestNewMetadataJSONReaderUnsupported(c *gc.C) {
   222  	file := bytes.NewBufferString(`{` +
   223  		`"ID":"20140909-115934.asdf-zxcv-qwe",` +
   224  		`"FormatVersion":2,` +
   225  		`"Checksum":"123af2cef",` +
   226  		`"ChecksumFormat":"SHA-1, base64 encoded",` +
   227  		`"Size":10,` +
   228  		`"Stored":"0001-01-01T00:00:00Z",` +
   229  		`"Started":"2014-09-09T11:59:34Z",` +
   230  		`"Finished":"2014-09-09T12:00:34Z",` +
   231  		`"Notes":"",` +
   232  		`"ModelUUID":"asdf-zxcv-qwe",` +
   233  		`"Machine":"0",` +
   234  		`"Hostname":"myhost",` +
   235  		`"Version":"1.21-alpha3",` +
   236  		`"ControllerUUID":"controller-uuid",` +
   237  		`"HANodes":3,` +
   238  		`"ControllerMachineID":"10",` +
   239  		`"ControllerMachineInstanceID":"inst-10101010"` +
   240  		`}` + "\n")
   241  	meta, err := backups.NewMetadataJSONReader(file)
   242  	c.Assert(meta, gc.IsNil)
   243  	c.Assert(err, jc.Satisfies, errors.IsNotSupported)
   244  }
   245  
   246  func (s *metadataSuite) TestBuildMetadata(c *gc.C) {
   247  	archive, err := os.Create(filepath.Join(c.MkDir(), "juju-backup.tgz"))
   248  	c.Assert(err, jc.ErrorIsNil)
   249  	_, err = archive.Write([]byte("<compressed data>"))
   250  	c.Assert(err, jc.ErrorIsNil)
   251  
   252  	fi, err := archive.Stat()
   253  	c.Assert(err, jc.ErrorIsNil)
   254  	finished := backups.FileTimestamp(fi).Unix()
   255  
   256  	meta, err := backups.BuildMetadata(archive)
   257  	c.Assert(err, jc.ErrorIsNil)
   258  
   259  	c.Check(meta.ID(), gc.Equals, "")
   260  	c.Check(meta.Checksum(), gc.Equals, "2jmj7l5rSw0yVb/vlWAYkK/YBwk=")
   261  	c.Check(meta.ChecksumFormat(), gc.Equals, "SHA-1, base64 encoded")
   262  	c.Check(meta.Size(), gc.Equals, int64(17))
   263  	c.Check(meta.Stored(), gc.IsNil)
   264  	c.Check(meta.Started.Unix(), gc.Equals, testing.ZeroTime().Unix())
   265  	c.Check(meta.Finished.Unix(), gc.Equals, finished)
   266  	c.Check(meta.Notes, gc.Equals, "")
   267  	c.Check(meta.Origin.Model, gc.Equals, backups.UnknownString)
   268  	c.Check(meta.Origin.Machine, gc.Equals, backups.UnknownString)
   269  	c.Check(meta.Origin.Hostname, gc.Equals, backups.UnknownString)
   270  	c.Check(meta.Origin.Version.String(), gc.Equals, backups.UnknownVersion.String())
   271  	c.Check(meta.FormatVersion, gc.Equals, backups.UnknownInt64)
   272  	c.Check(meta.Controller.UUID, gc.Equals, backups.UnknownString)
   273  	c.Check(meta.Controller.MachineInstanceID, gc.Equals, backups.UnknownString)
   274  	c.Check(meta.Controller.MachineID, gc.Equals, backups.UnknownString)
   275  	c.Check(meta.Controller.HANodes, gc.Equals, backups.UnknownInt64)
   276  }