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 }