Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
5276e03
feat: add diff command to generate a diff file between the local code…
rhythm-3099 Sep 28, 2023
4775bcb
chore: add diff flag for push command
rhythm-3099 Sep 28, 2023
7d26f62
chore: handle json diffing and address code review comments
rhythm-3099 Sep 29, 2023
a4bdf02
chore: address code review comment and handle an edge case of remote …
rhythm-3099 Sep 29, 2023
740038a
chore: split libraryDiff and serviceDiff into separate functions
rhythm-3099 Oct 2, 2023
11537a4
chore: add diffing logic for deviceRoles and deviceSchema
rhythm-3099 Oct 2, 2023
8e4664f
chore: add diffing logic for edges and edgesSchema
rhythm-3099 Oct 2, 2023
2e2daee
chore: add diffing logic for shared caches
rhythm-3099 Oct 6, 2023
05609da
chore: add diffing logic for timers
rhythm-3099 Oct 6, 2023
ac27ab4
chore: add diffing logic for users, userRoles and userSchema
rhythm-3099 Oct 6, 2023
5000a5b
chore: add diffing logic for webhooks
rhythm-3099 Oct 6, 2023
00d8a1f
chore: add diffing logic for message history storage
rhythm-3099 Oct 9, 2023
1fe118c
chore: add diffing logic for message type triggers
rhythm-3099 Oct 9, 2023
12829d4
chore: merge roles diffing code
rhythm-3099 Oct 9, 2023
b578673
chore: add diffing logic for roles
rhythm-3099 Oct 10, 2023
2badd0d
chore: add logic for push command using diff file
rhythm-3099 Oct 10, 2023
c153360
chore: refactor code for push command using diff file
rhythm-3099 Oct 10, 2023
7794304
chore: resolve code review comments
rhythm-3099 Oct 11, 2023
5073d1e
chore: diff only the custom columns for users, devices and roles
rhythm-3099 Oct 11, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
749 changes: 749 additions & 0 deletions createDiff.go

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions defs.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ var (
AutoApprove bool
TempDir string
SkipUpdateMapNameToIdFiles bool
PathForDiffFile string
)

var (
Expand Down
42 changes: 34 additions & 8 deletions export.go
Original file line number Diff line number Diff line change
Expand Up @@ -373,13 +373,15 @@ func pullDeployments(sysMeta *types.System_meta, cli *cb.DevClient) ([]map[strin
return deployments, nil
}

func pullAndWriteServiceCache(sysMeta *types.System_meta, cli *cb.DevClient, name string) (map[string]interface{}, error) {
func pullAndWriteServiceCache(sysMeta *types.System_meta, cli *cb.DevClient, name string, write bool) (map[string]interface{}, error) {
cache, err := cli.GetServiceCacheMeta(sysMeta.Key, name)
if err != nil {
return nil, err
}
if err = writeServiceCache(cache["name"].(string), cache); err != nil {
return nil, err
if write {
if err = writeServiceCache(cache["name"].(string), cache); err != nil {
return nil, err
}
}
return cache, nil
}
Expand Down Expand Up @@ -492,8 +494,20 @@ func pullSecrets(sysMeta *types.System_meta, cli *cb.DevClient) (map[string]inte
return theSecrets, nil
}

func pullMessageHistoryStorage(sysMeta *types.System_meta, cli *cb.DevClient) error {
func pullMessageHistoryStorage(sysMeta *types.System_meta, cli *cb.DevClient) ([]cb.GetMessageHistoryStorageEntry, error) {
storageEntries, err := cli.GetMessageHistoryStorage(sysMeta.Key)

if err != nil {
return nil, err
}

return storageEntries, nil;
}

func pullMessageHistoryStorageAndWrite(sysMeta *types.System_meta, cli *cb.DevClient) error {
storageEntries, err := cli.GetMessageHistoryStorage(sysMeta.Key)
fmt.Println("remotettt ", storageEntries)

if err != nil {
return fmt.Errorf("Could not pull message history storage out of system %s: %s", sysMeta.Key, err)
}
Expand All @@ -506,8 +520,18 @@ func pullMessageHistoryStorage(sysMeta *types.System_meta, cli *cb.DevClient) er
return nil
}

func pullMessageTypeTriggers(sysMeta *types.System_meta, cli *cb.DevClient) error {
func pullMessageTypeTriggers(sysMeta *types.System_meta, cli *cb.DevClient) ([]map[string]interface{}, error) {
msgTypeTriggers, err := cli.GetMessageTypeTriggers(sysMeta.Key)
if err != nil {
return nil, fmt.Errorf("Could not pull message type triggers out of system %s: %s", sysMeta.Key, err.Error())
}

return msgTypeTriggers, err
}

func pullMessageTypeTriggersAndWrite(sysMeta *types.System_meta, cli *cb.DevClient) error {
msgTypeTriggers, err := cli.GetMessageTypeTriggers(sysMeta.Key)
fmt.Println("remote ", msgTypeTriggers)
if err != nil {
return fmt.Errorf("Could not pull message type triggers out of system %s: %s", sysMeta.Key, err.Error())
}
Expand All @@ -532,13 +556,15 @@ func pullAndWriteSecret(sysMeta *types.System_meta, cli *cb.DevClient, name stri
return sec, nil
}

func pullAndWriteWebhook(sysMeta *types.System_meta, cli *cb.DevClient, name string) (map[string]interface{}, error) {
func pullAndWriteWebhook(sysMeta *types.System_meta, cli *cb.DevClient, name string, write bool) (map[string]interface{}, error) {
hook, err := cli.GetWebhook(sysMeta.Key, name)
if err != nil {
return nil, err
}
if err = writeWebhook(hook["name"].(string), hook); err != nil {
return nil, err
if write {
if err = writeWebhook(hook["name"].(string), hook); err != nil {
return nil, err
}
}
return hook, nil
}
Expand Down
41 changes: 41 additions & 0 deletions fs.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ const SORT_KEY_CODE_SERVICE = "Name"
const SORT_KEY_PORTAL = "Name"
const SORT_KEY_COLLECTION_ITEM = "item_id"
const SORT_KEY_COLLECTION = "Name"
const SORT_KEY_SERVICE_CACHES = "Name"
const SORT_KEY_TOPICS = "Name"
const collectionNameToIdFileName = "collections.json"
const roleNameToIdFileName = "roles.json"
const userEmailToIdFileName = "users.json"
Expand Down Expand Up @@ -1497,3 +1499,42 @@ func fileExists(name string) bool {
}
return true
}

func storeDataInJSONDiffFile(data DiffFileData, path string, fileName string) error {
marshalled, err := json.MarshalIndent(data, "", " ");

if err != nil {
fmt.Println("Error marshalling data ", err);
return err;
}

relativePath := ".";

if len(path) > 0 {
relativePath = path;
}

if err = ioutil.WriteFile(relativePath+"/"+fileName, marshalled, 0666); err != nil {
fmt.Println("Could not write to json file");
return err;
}

return nil;
}

func readDataFromJSONDiffFile(filename string) DiffFileData {
jsonStr, err := ioutil.ReadFile(filename)
if err != nil {
fmt.Println("Error reading the json file ", err);
}

var parsed DiffFileData

err = json.Unmarshal(jsonStr, &parsed)

if err != nil {
fmt.Println("error unmarshalling ", err)
}

return parsed;
}
4 changes: 4 additions & 0 deletions pull.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,10 @@ func pullAllUsers(systemKey string, client *cb.DevClient) ([]interface{}, error)
return paginateRequests(systemKey, DataPageSize, client.GetUserCountWithQuery, client.GetUsersWithQuery)
}

func pullUserRoles(systemKey string, userId string, client *cb.DevClient) ([]string, error) {
return client.GetUserRoles(systemKey, userId);
}

func PullAndWriteUsers(systemKey string, userName string, client *cb.DevClient, saveThem bool) ([]map[string]interface{}, error) {
if users, err := pullAllUsers(systemKey, client); err != nil {
return nil, err
Expand Down
8 changes: 4 additions & 4 deletions pullAndExportUtils.go
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@ func pullAssets(systemInfo *types.System_meta, client *cb.DevClient, assets Affe
if assets.ServiceCacheName != "" {
didSomething = true
logInfo(fmt.Sprintf("Pulling shared cache %+s\n", ServiceCacheName))
if _, err := pullAndWriteServiceCache(systemInfo, client, ServiceCacheName); err != nil {
if _, err := pullAndWriteServiceCache(systemInfo, client, ServiceCacheName, true); err != nil {
logError(fmt.Sprintf("Failed to pull shared cache. %s", err.Error()))
}
fmt.Printf("\n")
Expand All @@ -368,7 +368,7 @@ func pullAssets(systemInfo *types.System_meta, client *cb.DevClient, assets Affe
if assets.WebhookName != "" {
didSomething = true
logInfo(fmt.Sprintf("Pulling webhook %+s\n", WebhookName))
if _, err := pullAndWriteWebhook(systemInfo, client, WebhookName); err != nil {
if _, err := pullAndWriteWebhook(systemInfo, client, WebhookName, true); err != nil {
logError(fmt.Sprintf("Failed to pull webhook. %s", err.Error()))
}
fmt.Printf("\n")
Expand Down Expand Up @@ -458,7 +458,7 @@ func pullAssets(systemInfo *types.System_meta, client *cb.DevClient, assets Affe
if assets.MessageHistoryStorage || assets.AllAssets {
didSomething = true
logInfo("Pulling message history storage")
if err := pullMessageHistoryStorage(systemInfo, client); err != nil {
if err := pullMessageHistoryStorageAndWrite(systemInfo, client); err != nil {
logError(fmt.Sprintf("Failed to pull message history storage. %s", err.Error()))
}
fmt.Printf("\n")
Expand All @@ -467,7 +467,7 @@ func pullAssets(systemInfo *types.System_meta, client *cb.DevClient, assets Affe
if assets.MessageTypeTriggers || assets.AllAssets {
didSomething = true
logInfo("Pulling message type triggers")
err := pullMessageTypeTriggers(systemInfo, client)
err := pullMessageTypeTriggersAndWrite(systemInfo, client)
if err != nil {
logError(fmt.Sprintf("Failed to pull message type triggers. %s", err.Error()))
}
Expand Down
172 changes: 172 additions & 0 deletions push.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ func init() {
pushCommand.flags.StringVar(&BucketSetBoxName, "box", "", "Name of box to search in bucket set")
pushCommand.flags.StringVar(&BucketSetFileName, "file", "", "Name of file to push from bucket set box")
pushCommand.flags.StringVar(&SecretName, "user-secret", "", "Name of user secret to push")
pushCommand.flags.StringVar(&PathForDiffFile, "diff", "", "Relative path of the diff.json file to be used for pushing code services and libraries")

pushCommand.flags.IntVar(&MaxRetries, "max-retries", 3, "Number of retries to attempt if a request fails")
pushCommand.flags.IntVar(&DataPageSize, "data-page-size", DataPageSizeDefault, "Number of rows in a collection to push/import at a time")
Expand Down Expand Up @@ -1029,6 +1030,13 @@ func doPush(cmd *SubCommand, client *cb.DevClient, args ...string) error {
}
}

if PathForDiffFile != "" {
didSomething = true
if err := pushDiffEntities(systemInfo, PathForDiffFile, client); err != nil {
return err
}
}

if AllTriggers || AllAssets {
didSomething = true
if err := pushTriggers(systemInfo, client); err != nil {
Expand Down Expand Up @@ -2747,3 +2755,167 @@ func updateRole(systemInfo *types.System_meta, role map[string]interface{}, clie
}
return nil
}

func pushDeviceRolesFromSlice(systemInfo *types.System_meta, deviceRoles []string, client *cb.DevClient) error {
for _, deviceRole := range deviceRoles {
device, err := getDevice(deviceRole)

if err != nil {
return err
}

if err := updateDevice(systemInfo.Key, device, client); err != nil {
return err;
}
}
return nil;
}

func pushUserRolesFromSlice(systemInfo *types.System_meta, userRoles []string, client *cb.DevClient) error {
for _, userEmail := range userRoles {
user, err := getFullUserObject(userEmail)

if err != nil {
return err;
}

if err := updateUser(systemInfo, user, client); err != nil {
return err;
}
}
return nil;
}

type pushOneEntityFunc func(systemInfo *types.System_meta, client *cb.DevClient, name string) error

func pushEntityFromSlice(systemInfo *types.System_meta, entities []string, client *cb.DevClient, fn pushOneEntityFunc) error {
for _, entity := range entities {
if err := fn(systemInfo, client, entity); err != nil {
return err;
}
}
return nil;
}

func pushDiffEntities(systemInfo *types.System_meta, diffPath string, client *cb.DevClient) error {
var diffData DiffFileData;

diffData = readDataFromJSONDiffFile(diffPath);

if len(diffData.Services) > 0 {
logInfo("Pushing services");
if err := pushEntityFromSlice(systemInfo, diffData.Services, client, pushOneService); err != nil {
return err;
}
}

if len(diffData.Libraries) > 0 {
logInfo("Pushing libraries");
if err := pushEntityFromSlice(systemInfo, diffData.Libraries, client, pushOneLibrary); err != nil {
return err;
}
}

if len(diffData.Devices) > 0 {
logInfo("Pushing devices");
if err := pushEntityFromSlice(systemInfo, diffData.Devices, client, pushOneDevice); err != nil {
return err;
}
}

if len(diffData.DeviceRoles) > 0 {
logInfo("Pushing device roles");
if err := pushDeviceRolesFromSlice(systemInfo, diffData.DeviceRoles, client); err != nil {
return err;
}
}

if diffData.DeviceSchema {
logInfo("Pushing device schema")
if err := pushDevicesSchema(systemInfo, client); err != nil {
return err;
}
}

if len(diffData.Edges) > 0 {
logInfo("Pushing edges");
if err := pushEntityFromSlice(systemInfo, diffData.Edges, client, pushOneEdge); err != nil {
return err;
}
}


if diffData.EdgesSchema {
logInfo("Pushing edge schema");
if err := pushEdgesSchema(systemInfo, client); err != nil {
return err;
}
}

if diffData.MessageHistoryStorage {
logInfo("Pushing message history storage")
if err := pushMessageHistoryStorage(systemInfo, client); err != nil {
return err;
}
}

if diffData.MessageTypeTriggers {
logInfo("Pushing message type triggers")
if err := pushMessageTypeTriggers(systemInfo, client); err != nil {
return err;
}
}

if len(diffData.Roles) > 0 {
logInfo("Pushing roles");
if err := pushEntityFromSlice(systemInfo, diffData.Roles, client, pushOneRole); err != nil {
return err;
}
}

if len(diffData.SharedCaches) > 0 {
logInfo("Pushing shared caches");
if err := pushEntityFromSlice(systemInfo, diffData.SharedCaches, client, pushOneServiceCache); err != nil {
return err;
}
}

if len(diffData.Timers) > 0 {
logInfo("Pushing timers")
if err := pushEntityFromSlice(systemInfo, diffData.Timers, client, pushOneTimer); err != nil {
return err;
}
}

if len(diffData.Users) > 0 {
logInfo("Pushing users");
if err := pushEntityFromSlice(systemInfo, diffData.Users, client, pushOneUser); err != nil {
return err;
}
}

if len(diffData.UserRoles) > 0 {
logInfo("Pushing user roles")
if err := pushUserRolesFromSlice(systemInfo, diffData.UserRoles, client); err != nil {
return err;
}
}

if diffData.UserSchema {
logInfo("Pushing user schema")
if err := pushUserSchema(systemInfo, client); err != nil {
return err;
}
}

if len(diffData.Webhooks) > 0 {
logInfo("Pushing webhooks")
if err := pushEntityFromSlice(systemInfo, diffData.Webhooks, client, pushOneWebhook); err != nil {
return err;
}
}

logInfo("Successfully pushed the entities using the diff file")

return nil;
}
Loading