# Dry run for distributed syncing across devices pinned: ## Sprint: Raspberry pi platform testing Sprint status: current Sprint deadline: suggest deadline Apps for testing: Syncthing, yggdrasil, papad-api, papad monitor, papad frontend, Cow radio Description: We need to install all Apps, setup configuration, dockerize and have a single docker-compose file to bring up all the services. For yggdrasil and Cow Radio sanket might already have some scripts. Below are the tasks to run on raspberry pi 4 as of now, all of the below will need some scripts, for reference we can have a look at the source code of [Community Server](https://github.com/MoinhoDigital/community-server). - [x] **Install:** docker and docker-compose, create docker network and configuration - [x] **Config and setup:** Apart from Yggdrasil and cowradio, other apps are dockerised, and the `docker-compose` `Dockerfile` should be available in respective code repo or pantoto server - [ ] **Testing:** Prelim test case here for papad and papad-monitor testing [Test run of import / export scripts with syncthing](#Test-run-of-export--import-script-for-syncing) More test cases are needed. - [ ] **Integration Testing:** After above tasks, we would have a couple of different pi devices with all apps at different locations - [ ] **with internet:** connected to internet, we can demo test our logical mesh, with services running. files and annotations syncing, adding pi devices to syncthing, +more - [ ] **with interrupted internet:** TBA - [x] **without Internet:** TBA - [x] **Documentation:** Test results --- ## Context The below is the representation of a typical process on the hyper-local platform. ![](https://i.imgur.com/N3W7Osw.jpg) [TOC] ## Limitations The platform assumes certain underlying limitations as initial requirements for software developers, Devops, Admin teams to consider. - Devices hosting papad preferably Pi 4 - Syncthing for syncing resources - yggdrasil for network* - Audio Id for audio resource identification - All devices syncing should be in the same network - Toxbot for phone recordings and .. ### Papad app Papad monitor script - https://github.com/janastu/papad-monitor papad Api Server source - https://gitlab.com/servelots/papad-api Papad browser client source - - doesn't assume the source (or location) of the files (audio, images), meaning the files could be anywhere accessible by URI - more to be added - ## Use cases or user stories From the initial surveys, we have identified the personas, and documenting the user stories below. This will give a simplified idea to the developers and other stakeholders on what features we are looking at and how that will benefit the users. - As a dropout i want to record cooking recipes, so i can share with my neighbors and friends - As a teacher i want to teach hindi online, so i dont have to worry about gathering students due to covid - As a poet i want to do reading of my poems, so my friends can hear and comment back - As a student i want to find a teacher who can teach me dancing, so i can improve my dance skills - As a beautician i want to share beauty tips so i can improve my reach in the locality - As a cooking enthusiast i want to bookmark a particular duration in the recipe so i can specifically point at my questions / clarifications - As a music teacher i want to be able to mark a particular note in a song to explain cord progression to my students. - more to be added ## Test cases ### Test cases for syncthing Pantoto syncserver shared 3 folders with sagehome device sagehome device sharing the folders with arunpi, geeta, madhu and mani laptops and phones. 1. `papad-send` send only type 2. `papad-receive` receive only type 3. `papad-send-receive` send and receive type #### Test case 1: created a file on sagehome with name `sagehome-sending.txt` and added this to `/papad-receive` and `/papad-send-receive` folders. Expected outcome: all shared devices should be able to see `sagehome-sending.txt` in the `/papad-receive` and `/papad-send-receive` comments: > [name=bhanu] passed OK > #### Test case 2: Create a send only folder, checkout here on how to do it, https://docs.syncthing.net/users/foldertypes.html and share the folder with your peers. Add a new file to the send only type folder, expected outcome: all shared devices should be able to see the new file comments: > [name=bhanu] passed OK #### Test case 3: add a new file in papad-send folder expected outcome: other devices should not be able to see the file. comments: > [name=bhanu] passed OK > #### questions Add if anybody got questions ----- ### Test cases for Papad This space to document the test cases for implementation and integration. Test cases 1, 2 and 3 was added before the detailed discussions with Arun --- #### 1 * Test Case Id: papad-export-annos-to-folder * Assumptions: Choice of db (sqlite) with rest api * Test Data: papad-api.test.pantoto.org * Test Steps: 1. [x] deploy papad-api on server 2. [x] A script to export papad-api data to Syncthing outgoing folder (dir name: papad-annos-sync) * Expected Results: >The dir papad-annos-sync will have updated data from the DB * Result: Pass / Fail * Comments: [x] --- #### 2 * Test Case Id: papad-sync-annos-to-device * Assumptions: syncthing installed and configured in n devices * Test Data: papad-api.test.pantoto.org + some laptop * Test Steps: 1. deploy multiple papad instances 2. install and setup syncthing in all this devices 3. Start sync papad-annos-sync dir 4. Run script to import data from papad-annos-sync into DB * Expected Results: The dir papad-annos-sync will sync to local papad instances, and the browser should show latest audio and tags thats synced --- #### 3 * Test Case Id: papad-sync-media-to-device * Assumptions: syncthing installed and configured in n devices * Test Data: papad-api.test.pantoto.org + some laptop * Test Steps: 1. deploy multiple papad instances 2. install and setup syncthing in all this devices 3. Start sync of media folders 4. ? * Expected Results: TBA --- #### 4 * Test Case Id: recorderPi-Papad-local * Assumptions: * Test Data: * Test Steps: 1. Record a audio using recorder pi 2. Add recording (audio) to papad db 3. tag audio * Expected Resuts: Everything should work just fine * comments if test failed: --- #### 5 * Test Case Id: recorderPi-Papad-syncthing-to-remote * Assumptions: That test 4 (recorderPi-Papad-local) is passed * Test Data: * Test Steps: 1. Check if the remote server has synced the recording (audio) files 2. Check if remote papad has the entry to the audio file 3. tag audio * Expected Results: Everything should work just fine * comments if test failed: * #### 6 * Test Case Id: papad-remote-to-local * Assumptions: Syncthing installed and configured to folder served by web server * Test Data: from files.janastu.org * Test Steps: 1. Check sync path for new files 2. Add recording (audio) to papad db, choose a channel 3. tag audio * Expected Results: Everything should work just fine * comments if test failed: * --- ## Discussions Dinesh, Bhanu with Arun: suggestion for media syncing with dynamic document root a. http://da.pantoto.org/audio-girish-radio/FOLDER01/150409-153031.MP3 `<papad-service-name>/<pi-mac-id>/<path/file.ogg>` papad-service-name = da.pantoto.org pi-mac-id = audio-girish-radio (unique id across the network) path = FOLDER01/ file = file.ogg Will be effectively uuid `audio-girish-radio/FOLDER01/150409-153031.MP3` later will be unique by `$_$,$_$,$_$` `audio-girish-radio$_$FOLDER01$_$150409-153031.MP3` Arun: having a source URI and every pi will have a folder named by mac id and a curated folder in wich file name seperators will be underscore (`_`) pi 1 -> export csv into -> macid folder -> sync to pi 2 mac id folder -> --- more TBA ## Questions questions re. the distributed syncthing papad app * What will be the target of the annotations? * How will papad discover the newly synced data? * One way is to have a discovery service which will add database entries into local papad * How will devices discover eachother's syncthing? * how to setup incoming folders on pantoto? * ## Tasks [x] deploy papad-api on pantoto server (need help on this one) arun helped with this deployment [x] Facing issues with this, the deps are not clean, debugging manually, also asking vignesh to help out [x] solved: Pandas is not building [x] deploy papad-api in laptops (add laptops here) and devices. [x]Visual diagram of system process [x] Mani working on the digital version [] Install recording pi and papad together on a raspberry pi - Shalini is working on this [x] Arun is working on a script to manage export import from / to db so that syncthing can sync exported json files [] Athithya is working on the beta upgrades to annotate fragment of audio - in progress [] Papad client bug fixes - Athithya [x] Shalini deployed syncthing on server [] Syncthing server configuration - Unassigned ## Illustrations Documenting all versions of illustrations and diagrams Process diagrams ![](https://i.imgur.com/MYMSe96.png) The below has been asked for some more edits ![](https://i.imgur.com/JnLV7QY.jpg) ![](https://i.imgur.com/WLqS2ww.jpg) System architecture diagram ## Resources and readings - Similar question using sqlite; suggestions in answers (https://github.com/rqlite/rqlite) - (question) https://stackoverflow.com/questions/16032825/method-to-replicate-sqlite-database-across-multiple-servers - Some limits of rqlite or raft protocol to keep in mind - For a cluster of N nodes in size to remain operational, at least (N/2)+1 nodes must be up and running, and be in contact with each other. - Clusters of 3, 5, 7, or 9, nodes are most practical. Clusters of those sizes can tolerate failures of 1, 2, 3, and 4 nodes respectively. - Clusters with a greater number of nodes start to become unweildy, due to the number of nodes that must be contacted before a database change can take place. ## Test run of export / import script for syncing 29/06/2020 Arun, Athithya, Bhanu * Install sync scripts * configure syncthing path in env variable * Run papa-api locally * Run sync scripts main.py * ~~Set env var SYNCTHING_PATH and run dump.py in a another terminal, this will export local db into json file~~ deprecated * sync the exported json file * After adding device, the files sync to deafult folder path * Syncthing might have a diff to see if the file changed * >Test case: Possible bug: i notify not reading incoming sync json file - bug fixed * There is something called syncthing inotify - not needed Test cases passed 1. run dump script, will dump the db contents into a json file, filename is macid.json 2. run main.py will look for changes in macid.json file, and import the changes ## Links Sanket's pulse audio testing [ServeLots Webinar Pi](/CBbF7cMXTyylW9hutayWqA)