2023-03-31 15:11:33 -07:00

178 lines
3.9 KiB
Go

package main
import (
"compress/gzip"
"encoding/json"
"fmt"
"math/rand"
"os"
"time"
"github.com/pkg/errors"
"golang.org/x/exp/maps"
"github.com/alcionai/corso/src/cmd/jsondebug/common"
)
const (
hostName = "host-name"
userName = "user-name"
)
func generateManifestEntry() (*common.ManifestEntry, error) {
snapMan := generateSnapManifest()
// Base tag set for all snapshots.
tags := map[string]string{
"type": "snapshot",
"hostname": snapMan.Source.Host,
"username": snapMan.Source.UserName,
"path": snapMan.Source.Path,
}
maps.Copy(tags, snapMan.Tags)
serializedSnapMan, err := json.Marshal(snapMan)
if err != nil {
return nil, errors.Wrap(err, "serializing inner struct")
}
res := &common.ManifestEntry{
ID: randStringLen(32),
ModTime: time.Now(),
Deleted: rand.Uint32()&1 != 0,
Labels: tags,
Content: serializedSnapMan,
}
return res, nil
}
func generateSnapManifest() common.SnapManifest {
var incomplete string
// Roughly 1/4 incomplete.
if rand.Intn(100) < 25 {
incomplete = "checkpoint"
}
path := randString()
res := common.SnapManifest{
Source: common.SourceInfo{
Host: hostName,
UserName: userName,
Path: path,
},
StartTime: rand.Int63(),
EndTime: rand.Int63(),
Stats: common.StatsS{
TotalFileSize: rand.Int63(),
ExcludedTotalFileSize: int64(rand.Uint32()),
TotalFileCount: rand.Int31(),
CachedFiles: rand.Int31(),
NonCachedFiles: rand.Int31(),
TotalDirectoryCount: rand.Int31(),
ExcludedFileCount: rand.Int31(),
ExcludedDirCount: rand.Int31(),
IgnoredErrorCount: rand.Int31(),
ErrorCount: rand.Int31(),
},
IncompleteReason: incomplete,
RootEntry: &common.DirEntry{
Name: path,
EntryType: randStringLen(1),
Permissions: rand.Intn(512),
FileSize: rand.Int63(),
ModTime: rand.Int63(),
UserID: rand.Int31(),
GroupID: rand.Int31(),
ObjectID: randStringLen(32),
DirSummary: &common.DirectorySummary{
TotalFileSize: rand.Int63(),
TotalFileCount: rand.Int63(),
TotalSymlinkCount: rand.Int63(),
TotalDirCount: rand.Int63(),
MaxModTime: rand.Int63(),
IncompleteReason: incomplete,
FatalErrorCount: rand.Int(),
IgnoredErrorCount: rand.Int(),
},
},
Tags: map[string]string{
// User stand-in.
"tag:" + randStringLen(40): "0",
"tag:backup-id": randStringLen(36),
"tag:is-canon-backup": "0",
// Service/data type stand-in.
"tag:" + randStringLen(20): "0",
},
}
return res
}
var charSet = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789")
func randString() string {
// String lengths between [10, 128] bytes.
return randStringLen(rand.Intn(119) + 10)
}
func randStringLen(length int) string {
res := make([]rune, length)
for i := range res {
res[i] = charSet[rand.Intn(len(charSet))]
}
return string(res)
}
func main() {
data := &common.Manifest{
Entries: make([]*common.ManifestEntry, 0, common.NumItems),
}
for i := 0; i < common.NumItems; i++ {
entry, err := generateManifestEntry()
if err != nil {
fmt.Printf("Error generating random entry: %v\n", err)
return
}
data.Entries = append(data.Entries, entry)
}
f, err := os.Create(common.ManifestFileName)
if err != nil {
fmt.Printf("Error making regular output file: %v\n", err)
return
}
defer f.Close()
enc := json.NewEncoder(f)
if err := enc.Encode(data); err != nil {
fmt.Printf("Error writing json to regular file: %v\n", err)
return
}
fgz, err := os.Create(common.ManifestFileName + common.GzipSuffix)
if err != nil {
fmt.Printf("Error making gzip output file: %v\n", err)
return
}
defer fgz.Close()
gz := gzip.NewWriter(fgz)
defer gz.Close()
enc = json.NewEncoder(gz)
if err := enc.Encode(data); err != nil {
fmt.Printf("Error writing json to regular file: %v\n", err)
return
}
}