Skip to end of banner
Go to start of banner

Common Client Command set and Cache ("C4")

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 31 Next »

This is the specification of the command sets for Synapse clients.  The goal is to align the command sets for clients in different languages to ease users' transitions between languages.  Additionally we define the organization of the file cache so that various clients arrange local copies of file consistently.

 

CommandcommentsR SyntaxPython SyntaxCommand Line Syntax
1 – Basic Level    
Create a Synapse file handle in memory, specifying the path to the file in the local file system, the name in Synapse, and the Folder in Synapse.  This step 'stages' a file to be sent to Synapse. Additional parameters (...) are interpreted as properties or annotations, in the manner of synSet(), defined below.  If 'synapseUpload' is TRUE then the file is uploaded to S3, else only the location is persisted.The specified file doesn't move or get copied at this time.File(path="/path/to/file", name="foo", parentId="syn101", synapseUpload=TRUE, ...)File(path="/path/to/file", name="foo", parentId="syn101", synapseUpload=TRUE, **kwargs)NA
Create a Synapse file handle in memory which will be a serialized version of an in-memory object.  Additional parameters (...) are interpreted as properties or annotations, in the manner of synSet(), defined below.

The object is not serialized at this time. 

(We are hoping people will like calling the object a File, even though it takes an in-memory object as a parameter.)

File(obj=<obj ref>, name="foo", parentId="syn101", synapseUpload=TRUE, ...)Will not be implemented in python.NA
Create a Synapse Record in memory, specifying the paths to one or more files in the local file system, the name in Synapse, and the Folder in Synapse.  This step 'stages' a Record to be sent to Synapse. 

Additional parameters (...) are interpreted as properties or annotations, in the manner of synSet(), defined below.

 

Files aren't moved or copied.

TODO:  How do you specify file annotations (as distinct from Strings)?  Shall we introduce in-memory wrappers around files and urls to help distinguish them?

Record(name="foo", parentId="syn101", ...)Record(name="foo", parentId="syn101", **kwargs) 
Create a Folder or Project in memory. Name and parentId are optional. 

Folder(name="foo", parentId="syn101", ...)

Project(name="foo", ...)

Folder(name="foo", parentId="syn101", **kwargs)

Project(name="foo", **kwargs)

 
Set an entity's attribute (property or annotation) in memory.  Client first checks properties, then goes to annotations; setting to NULL deletes itTODO:  we want to include files and (for R) in memory objectssynAnnot(entity, name)<-valueentity.parentId="syn101" 
Gets an entity's attribute value (property or annotation) from the object already in memory. 

synAnnot(entity, name); returns NULL if undefined

entity.name; throws exception if value is undefined 
Create or update an entity (File, Folder, etc.) in Synapse.  May also specify (1) whether a name collision in an attempted 'create' should become an 'update', (2) whether to 'force' a new version to be created, (3) the list of entities 'used' to generate this one, (4) the list of entities 'executed' to generate this one, (5) the name of the generation activity, and (6) the description of the generation activity.TODO:  Give some examples.synStore(entity, used, executed, activityName=NULL, activityDescription=NULL, createOrUpdate=T, forceVersion=T)synStore(entity, used, executed, activityName=None, activityDescription=None, createOrUpdate=T, forceVersion=T) 
Get an entity (file, folder, etc.) from the Synapse server, with its attributes (properties, annotations) and, optionally, with its associated file(s). synGet(id, version, downloadFile=T, load=T)synapse.get(id, version, downloadFile=True, load=True)synapse get ID -v NUMBER
  synGet(entity, downloadFile=T, load=T)  
Open the web browser to the page for this entity. onWeb(entityId) / onWeb(entity)  
log-inget API key and write to user's properties filesynapseLogin(<user>,<pw>)  
log-outdelete API key from properties filesynapseLogout()  
Run code, capturing output, code and provenance relationship. synapseExceute()  
2 – Power User Level    
Execute queryTODO:  pagination, e.g. the function returns an iterator. Look at current implementation in R client.synQuery(queryString)  
we talked about this, but is it needed? synGetEntity()  
we talked about this, but is it needed? synStoreEntity()  
Delete an entity, and all of its children (e.g. all Folders and Files within a Folder). synDelete()  
Retrieve the wiki for an entityTODO: Is it a requirement that we retrieve attachments?  If not, do we retrieve file handles?synGetWiki(id, version) / synGetWiki(entity)  
  synStoreWiki()  
  synGetAnnotations()  
  synSetAnnotations()  
  synGetProperties()  
Access properties, throwing exception if property is not defined. synSetProperties()  
  synGetAnnotation()  
  synSetAnnotation()  
Access property, throwing exception if property is not defined. synGetProperty()  
Access property, throwing exception if property is not defined. Setting to NULL deletes. synSetProperty()  
Create an Activity (provenance object) in memory. Activity(name, description, used, executed)  
Create or update the Activity in Synapse synStoreActivity(activity)  
Get the Activity which generated the given entity. synGetActivity(entity) / synGetActivity(entityId)  
Set the Activity which generated the given entity synSetActivity(entity)<-activity  
     
3 – Web API Level    
Execute GET request synRestGET(endpoint, uri)  
Execute POST request synRestPOST(endpoint, uri, body)  
Execute PUT request synRestPUT(endpoint, uri, body)  
Execute DELETE request synRestDELETE(endpoint, uri)  

 

Common Configuration File

This is a properties file in a standard place that is interpreted upon client initialization.

TODO:  What is the format?  JSON?  Like a Java properties file (ea. line "foo=bar")?  Other?

Things to specify in the common config file:

  • username/password (or key)
  • root cache location

Cache Design Principles

The function and design principles of the client-side file cache need to be made explicit and consistent across analytical clients.

Current implementation within the R Client:

  • only entity files are cached (not metadata)
  • cache is mix of read/write
  • each entity version has a location within the cache is based on its URI (e.g. .synapseCache/proddata.sagebase.org/<entityId>/<locationId>/version/<version>)
    • files.json specifies what resides within the archive
    • <fileName> file which R Client currently assumes to be a zip (this is immutable by convention until storeEntity is called)
    • <fileName>_unpacked directory within which all unzipped content lives
      • this subdirectory is writable (by convention)
      • re-stores file if not an archive (both as <fileName> and <fileName>_unpacked/<fileName>)

 

Each analytical client client has a file cache on the local file system.  When an File or Record entity is fetched, if its associated files are fetched then they go into the cache.

When a file is added to an entity and pushed to Synapse, the local copy does not move.  Thus there is no guarantee that the local file associated with an entity be in the download cache.  (The entity must keep a reference to the local file handle.)  (The arguments for this principle are:  Moving large files could be expensive with wasteful duplication; the file might be a script that the user is editing.)

The files in the cache may be modified. That is, the client may not assume that a file in the cache is identical to the one in Synapse, even if the entity's e-tag has not changed. (TODO:  How DOES the client know a file has been modified? One way is to keep a copy of the md5 in memory upon synGet or synStore, and compare when storing again.)

TODO:  When the client does synGet() and the associated file(s) is/are in the cache already, how does it know whether to download again?  One way is to compute the local file(s) md5(s) and compare to those in Synapse.

TODO:  What if you add a script to a FIle entity, synStore(), exit, restart and synGet()?  You now have two copies of the file, one in the cache and the original elsewhere.  The user would like to keep editing the original and, upon synStore(), update again.  How does the client know to associate the original?  One solution:  Client keeps a map of <Syn FileHandle> -> <local location> which gets saved upon exit and loaded upon start-up and which 'overlays' or 'amends' the default cache mapping.

TODO: read a remote file, edit it, lose session, then repeat 'loadEntity', keep editing local file, push/store entity what should happen?

TODO: how can we download a folder hierarchy and have that hierarchy reflected in the system?  One approach is to mimic the situation in which we upload a folder hierarchy, keeping pointers to files which are outside of the cache.  I.e. we download the files into a folder hierarchy outside of the normal cache and keep in-memory pointers to those file locations.  In this case Synapse would hold the "truth" about the hierarchy, so the user would not be allowed to move things around locally without messing up the cache.

 

 

 

 

 

 

 

  • No labels