From ff0ee44d93351a2d293843baf9491c547cb905ac Mon Sep 17 00:00:00 2001 From: DanielSollis Date: Fri, 12 May 2023 01:09:35 -0700 Subject: [PATCH 1/5] initial work --- cmd/gdsutil/main.go | 72 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/cmd/gdsutil/main.go b/cmd/gdsutil/main.go index 4b927cc07..d54ef50f9 100644 --- a/cmd/gdsutil/main.go +++ b/cmd/gdsutil/main.go @@ -349,8 +349,21 @@ func main() { }, }, }, + { + Name: "contact:migrate", + Usage: "", + Category: "contact", + Action: migrateContacts, + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "dryrun", + Aliases: []string{"d"}, + Usage: "", + Value: true, + }, + }, + }, } - app.Run(os.Args) } @@ -1244,6 +1257,63 @@ func generateTokenKey(c *cli.Context) (err error) { return nil } +func migrateContacts(c *cli.Context) (err error) { + modelContacts := make(map[string]*models.Contact) + var vaspContacts []*pb.Contact + iter := ldb.NewIterator(util.BytesPrefix([]byte(wire.NamespaceVASPs)), nil) + for iter.Next() { + vasp := new(pb.VASP) + if err = proto.Unmarshal(iter.Value(), vasp); err != nil { + iter.Release() + return cli.Exit(err, 1) + } + iter := models.NewContactIterator(vasp.Contacts, true, false) + for iter.Next() { + vaspContact, _ := iter.Value() + vaspContacts = append(vaspContacts, vaspContact) + modelContact, AlreadyExists := modelContacts[vaspContact.Email] + if !AlreadyExists { + vaspContactExtra := &models.GDSContactExtraData{} + if vaspContact.Extra != nil { + if err = vaspContact.Extra.UnmarshalTo(vaspContactExtra); err != nil { + return fmt.Errorf("could not deserialize previous extra: %s", err) + } + } + + modelContact = &models.Contact{ + Email: vaspContact.Email, + Name: vaspContact.Name, + Vasps: []string{vasp.CommonName}, + Verified: vaspContactExtra.Verified, + Token: vaspContactExtra.Token, + EmailLog: vaspContactExtra.EmailLog, + Created: time.Now().Format(time.RFC3339), + Modified: time.Now().Format(time.RFC3339), + } + } else { + modelContact.Vasps = append(modelContact.Vasps, vasp.CommonName) + // append email log + } + } + } + for _, contact := range modelContacts { + if c.Bool("dryrun") { + // print model contacts and vasp contacts + } else { + var data []byte + key := []byte(wire.NamespaceContacts + "::" + contact.Email) + if data, err = proto.Marshal(contact); err != nil { + return cli.Exit(err, 1) + } + + if err = ldb.Put(key, data, nil); err != nil { + return cli.Exit(err, 1) + } + } + } + return nil +} + //=========================================================================== // Helper Functions //=========================================================================== From 99ab9264a65f7c26ca4d2ffe39af45c79ae53b13 Mon Sep 17 00:00:00 2001 From: DanielSollis Date: Fri, 12 May 2023 01:16:33 -0700 Subject: [PATCH 2/5] finished initial implementation --- cmd/gdsutil/main.go | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/cmd/gdsutil/main.go b/cmd/gdsutil/main.go index d54ef50f9..c324ee340 100644 --- a/cmd/gdsutil/main.go +++ b/cmd/gdsutil/main.go @@ -1272,14 +1272,15 @@ func migrateContacts(c *cli.Context) (err error) { vaspContact, _ := iter.Value() vaspContacts = append(vaspContacts, vaspContact) modelContact, AlreadyExists := modelContacts[vaspContact.Email] - if !AlreadyExists { - vaspContactExtra := &models.GDSContactExtraData{} - if vaspContact.Extra != nil { - if err = vaspContact.Extra.UnmarshalTo(vaspContactExtra); err != nil { - return fmt.Errorf("could not deserialize previous extra: %s", err) - } + + vaspContactExtra := &models.GDSContactExtraData{} + if vaspContact.Extra != nil { + if err = vaspContact.Extra.UnmarshalTo(vaspContactExtra); err != nil { + return fmt.Errorf("could not deserialize previous extra: %s", err) } + } + if !AlreadyExists { modelContact = &models.Contact{ Email: vaspContact.Email, Name: vaspContact.Name, @@ -1292,20 +1293,26 @@ func migrateContacts(c *cli.Context) (err error) { } } else { modelContact.Vasps = append(modelContact.Vasps, vasp.CommonName) - // append email log + modelContact.EmailLog = append(modelContact.EmailLog, vaspContactExtra.EmailLog...) } } } - for _, contact := range modelContacts { - if c.Bool("dryrun") { - // print model contacts and vasp contacts - } else { + if c.Bool("dryrun") { + fmt.Println("existing vasp contacts:") + for _, contact := range vaspContacts { + fmt.Print(contact) + } + fmt.Println("created contacts:") + for _, contact := range modelContacts { + fmt.Print(contact) + } + } else { + for _, contact := range modelContacts { var data []byte key := []byte(wire.NamespaceContacts + "::" + contact.Email) if data, err = proto.Marshal(contact); err != nil { return cli.Exit(err, 1) } - if err = ldb.Put(key, data, nil); err != nil { return cli.Exit(err, 1) } From 6c6ad30b91e9b5b930da7e03eb50f3cec90656ad Mon Sep 17 00:00:00 2001 From: DanielSollis Date: Fri, 12 May 2023 02:07:41 -0700 Subject: [PATCH 3/5] added documentation --- cmd/gdsutil/main.go | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/cmd/gdsutil/main.go b/cmd/gdsutil/main.go index c324ee340..6f07fee7d 100644 --- a/cmd/gdsutil/main.go +++ b/cmd/gdsutil/main.go @@ -1258,8 +1258,11 @@ func generateTokenKey(c *cli.Context) (err error) { } func migrateContacts(c *cli.Context) (err error) { + // Create a list of vasp contacts and model contacts modelContacts := make(map[string]*models.Contact) var vaspContacts []*pb.Contact + + // iterate through all vasps in the database iter := ldb.NewIterator(util.BytesPrefix([]byte(wire.NamespaceVASPs)), nil) for iter.Next() { vasp := new(pb.VASP) @@ -1268,11 +1271,14 @@ func migrateContacts(c *cli.Context) (err error) { return cli.Exit(err, 1) } iter := models.NewContactIterator(vasp.Contacts, true, false) + + // Iterate through all contacts on the vasp for iter.Next() { vaspContact, _ := iter.Value() vaspContacts = append(vaspContacts, vaspContact) modelContact, AlreadyExists := modelContacts[vaspContact.Email] + // Extract the extra fields from the vasp contact vaspContactExtra := &models.GDSContactExtraData{} if vaspContact.Extra != nil { if err = vaspContact.Extra.UnmarshalTo(vaspContactExtra); err != nil { @@ -1280,6 +1286,8 @@ func migrateContacts(c *cli.Context) (err error) { } } + // If the model contact doesn't already exist create it, + // if it does update the email log and vasp list if !AlreadyExists { modelContact = &models.Contact{ Email: vaspContact.Email, @@ -1297,6 +1305,9 @@ func migrateContacts(c *cli.Context) (err error) { } } } + + // if the dryrun flag is set, print all vasp contacts and the + // newly created model contacts and return if c.Bool("dryrun") { fmt.Println("existing vasp contacts:") for _, contact := range vaspContacts { @@ -1306,16 +1317,18 @@ func migrateContacts(c *cli.Context) (err error) { for _, contact := range modelContacts { fmt.Print(contact) } - } else { - for _, contact := range modelContacts { - var data []byte - key := []byte(wire.NamespaceContacts + "::" + contact.Email) - if data, err = proto.Marshal(contact); err != nil { - return cli.Exit(err, 1) - } - if err = ldb.Put(key, data, nil); err != nil { - return cli.Exit(err, 1) - } + return nil + } + + // Put all new model contacts into the leveldb database + for _, contact := range modelContacts { + var data []byte + key := []byte(wire.NamespaceContacts + "::" + contact.Email) + if data, err = proto.Marshal(contact); err != nil { + return cli.Exit(err, 1) + } + if err = ldb.Put(key, data, nil); err != nil { + return cli.Exit(err, 1) } } return nil From 46977a7c778664d40b37b6c5956dde2670a9b07d Mon Sep 17 00:00:00 2001 From: DanielSollis Date: Fri, 12 May 2023 02:10:36 -0700 Subject: [PATCH 4/5] completed documentation --- cmd/gdsutil/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/gdsutil/main.go b/cmd/gdsutil/main.go index 6f07fee7d..a1d1f589f 100644 --- a/cmd/gdsutil/main.go +++ b/cmd/gdsutil/main.go @@ -351,14 +351,14 @@ func main() { }, { Name: "contact:migrate", - Usage: "", + Usage: "migrate all contacts on vasps into the model contacts namespace", Category: "contact", Action: migrateContacts, Flags: []cli.Flag{ &cli.BoolFlag{ Name: "dryrun", Aliases: []string{"d"}, - Usage: "", + Usage: "print migration results without modifying the database, used for testing", Value: true, }, }, From b81addfe7d88136082a580f6ba5c151ffc5d464e Mon Sep 17 00:00:00 2001 From: DanielSollis Date: Mon, 15 May 2023 14:19:28 -0700 Subject: [PATCH 5/5] PR review changes --- cmd/gdsutil/main.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/gdsutil/main.go b/cmd/gdsutil/main.go index a1d1f589f..9aa43275b 100644 --- a/cmd/gdsutil/main.go +++ b/cmd/gdsutil/main.go @@ -1301,7 +1301,9 @@ func migrateContacts(c *cli.Context) (err error) { } } else { modelContact.Vasps = append(modelContact.Vasps, vasp.CommonName) - modelContact.EmailLog = append(modelContact.EmailLog, vaspContactExtra.EmailLog...) + if vaspContactExtra.EmailLog != nil { + modelContact.EmailLog = append(modelContact.EmailLog, vaspContactExtra.EmailLog...) + } } } } @@ -1313,6 +1315,7 @@ func migrateContacts(c *cli.Context) (err error) { for _, contact := range vaspContacts { fmt.Print(contact) } + fmt.Println() // Print a new line for clarity fmt.Println("created contacts:") for _, contact := range modelContacts { fmt.Print(contact)