Question
· Nov 5, 2019

Backport eCQM to Astronaut VistA.

Hello, 

Astronaut, LLC needs Meaningful Use QRDA c1 requirement passed. We do not have a spare engineering team to write it all from scratch.  Indian Health Service RPMS https://code.osehra.org/journal/journal/view/1576 has it in the public domain as a sub application called eCQM. We would like to backport eCQM to its close cousin our Veterans Affairs(VA) VistA variant Astronaut VistA.  We would first like to simply get eCQM working in its native environment before attempting to back port to Astronaut VistA.  RPMS currently uses Cache and Ensemble. I've been directed to use IRIS. I've also received the suggestion to use Cache and Ensemble but I have no licenses. I have brought up IRIS community and am now thinking of the next steps. 

Suggestions are welcome on how to proceed. 

-- IV

Discussion (23)1
Log in or sign up to continue

I'm not at all familiar with this eCQM package, but I don't see any reason it wouldn't work on IRIS.  Just import the code.  The system interaction and device handling is where you would be most likely to encounter issues.  The VistA Kernel encapsulates these and so insulates application code from those details.  You may not encounter issues with Kernel but if you do, solving them would require an advanced level of VistA skills.  I think the easiest/fastest path would be to just load it up and see what breaks.  It may be that you can get your work done without any issues.

Hi Ignacio

I think your next step is to get your CACHE.DAT that contains RPMS up and running on IRIS.

1.     Copy your (dismounted) CACHE.DAT file to the cloud server

2.     Rename the file to IRIS.DAT

3.     Create a Database/Namespace in IRIS that uses this database file.
          (dont forget to add all of the appropriate RPMS global and routine mappings)

Once you get to this point everything else is application related and the best source for information about that would be the Indian Health Service themselves.  

Should I be concerned about these errors?

Enabling namespace 'RPMS' for Interoperability:
* This instance is not in a mirror
* Mappings
- Class:
 + Adding class mapping Ens -> ENSLIB
 + Adding class mapping EnsLib -> ENSLIB
 + Adding class mapping EnsPortal -> ENSLIB
 + Adding class mapping CSPX.Dashboard -> ENSLIB
- Routine:
 + Adding routine mapping Ens* -> ENSLIB
- Global:
 + Checking/fixing global directory settings for existing global ^EnsDICOM.Dictionary
 + Checking/fixing global directory settings for existing global ^EnsEDI.Description
 + Checking/fixing global directory settings for existing global ^EnsEDI.Schema
 + Creating new global directory entry for ^EnsEDI.X12.Description
   Error when saving global entry: ERROR #5002: ObjectScript error: <PROTECT>%SaveData+10^%Library.GlobalEdit.1 ^EnsEDI.X12.Description,/ISC/dur/mgr/IHSFOIARPMS/
 + Creating new global directory entry for ^EnsEDI.X12.Schema
   Error when saving global entry: ERROR #5002: ObjectScript error: <PROTECT>%SaveData+10^%Library.GlobalEdit.1 ^EnsEDI.X12.Schema,/ISC/dur/mgr/IHSFOIARPMS/
 + Creating new global directory entry for ^IRIS.Msg
   Error when saving global entry: ERROR #5002: ObjectScript error: <PROTECT>%SaveData+10^%Library.GlobalEdit.1 ^IRIS.Msg,/ISC/dur/mgr/IHSFOIARPMS/
 + Creating new global directory entry for ^IRIS.MsgNames
   Error when saving global entry: ERROR #5002: ObjectScript error: <PROTECT>%SaveData+10^%Library.GlobalEdit.1 ^IRIS.MsgNames,/ISC/dur/mgr/IHSFOIARPMS/
 + Adding global mapping ^EnsDICOM.Dictionary -> ENSLIB
 + Adding global mapping ^EnsEDI.Description("X","X12") -> ENSLIB
 + Adding global mapping ^EnsEDI.Schema("HIPAA_4010") -> ENSLIB
 + Adding global mapping ^EnsEDI.Schema("HIPAA_5010") -> ENSLIB
 + Adding global mapping ^EnsEDI.Schema("ISC_00401") -> ENSLIB
 + Adding global mapping ^EnsEDI.Schema("ISC_00405") -> ENSLIB
 + Adding global mapping ^EnsEDI.X12.Description("HIPAA_4010") -> ENSLIB
 + Adding global mapping ^EnsEDI.X12.Description("HIPAA_5010") -> ENSLIB
 + Adding global mapping ^EnsEDI.X12.Schema("HIPAA_4010") -> ENSLIB
 + Adding global mapping ^EnsEDI.X12.Schema("HIPAA_5010") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("Arial,Tahoma,Verdana") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("Confirm") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EDIDocumentView") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("Ens") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsAlert") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsBPL") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsColumns") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsDICOM") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsEDI") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsEDIEDIFACT") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsEDIHL7") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsEDISEF") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsEDIX12") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsEnt") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsLDAP") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsPushNotifications") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsRecordMap") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsSAP") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsSR") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsSearchTable") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsWf") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsXPATH") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("EnsebXML") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("Ensemble") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("RuleEditor") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("Workflow") -> ENSLIB
 + Adding global mapping ^IRIS.Msg("tahoma,verdana") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("Arial,Tahoma,Verdana") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("Confirm") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EDIDocumentView") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("Ens") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsAlert") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsBPL") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsColumns") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsDICOM") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsEDI") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsEDIEDIFACT") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsEDIHL7") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsEDISEF") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsEDIX12") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsEnt") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsLDAP") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsPushNotifications") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsRecordMap") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsSAP") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsSR") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsSearchTable") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsWf") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsXPATH") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("EnsebXML") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("Ensemble") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("RuleEditor") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("Workflow") -> ENSLIB
 + Adding global mapping ^IRIS.MsgNames("tahoma,verdana") -> ENSLIB
- Updating CPF
- Moving changes to active configuration
 - Loading new mappings for namespace 'RPMS'
* Validating Installation in 'RPMS'
- Checking class 'Ens.Director' ...
- Checking class 'Ens.MessageBody' ...
- Checking class 'Ens.StudioManager' ...
* Creating Interoperability Management Portal
- Not copying legacy CSP pages for portal application
- Configuring portal: /csp/rpms [RPMS] using /ISC/dur/csp/rpms
- Creating directory: /ISC/dur/csp/rpms
- Creating CSP Application: /csp/rpms
   Name                 = [/csp/rpms]
   AutheEnabled         = [32]
   Enabled              = [1]
   Description          = [Interoperability Management Portal]
   Resource             = [%Ens_Portal]
   AutoCompile          = [0]
   Timeout              = [900]
   Path                 = [/ISC/dur/csp/rpms]
   Recurse              = [1]
   LoginPage            = []
   InbndWebServicesEnabled = [1]
   TwoFactorEnabled     = [0]
   IsNameSpaceDefault   = [0]
   PermittedClasses     = []
   MatchRoles           = []
   Type                 = [2]
   CookiePath           = [/csp/rpms/]
   LockCSPName          = [1]
   NameSpace            = [RPMS]
   CSPZENEnabled        = [1]
   GroupById            = [%ISCMgtPortal]
   ServeFiles           = [2]
   UseCookies           = [2]
- Removing legacy CSP pages and files from directory '/ISC/dur/csp/rpms/'
- Not compiling portal '/csp/rpms/' in RPMS as no CSP files were copied
* Adding explicit SQL privileges to Interoperability Roles
- Adding SQL privileges for role '%EnsRole_Administrator'
- Adding SQL privileges for role '%EnsRole_AlertOperator'
- Adding SQL privileges for role '%EnsRole_Developer'
- Adding SQL privileges for role '%EnsRole_Monitor'
- Adding SQL privileges for role '%EnsRole_Operator'
- Adding SQL privileges for role '%EnsRole_RegistryManager'
- Adding SQL privileges for role '%EnsRole_RegistrySelect'
- Adding SQL privileges for role '%EnsRole_RulesDeveloper'
- Adding SQL privileges for role '%EnsRole_WebDeveloper'
* Adding Interoperability SearchTables
- Validating all SearchTable metadata
 - Regenerating metadata for EnsLib.EDI.EDIFACT.SearchTable
ERROR #5002: ObjectScript error: <PROTECT>%SaveData+31^Ens.Config.SearchTableProp.1 ^Ens.Config.SearchTablePropD("EnsLib.EDI.EDIFACT.SearchTable","Identifier"),/ISC/dur/mgr/IHSFOIARPMS/
Update Complete.
ERROR #5002: ObjectScript error: <PROTECT>%SaveData+31^Ens.Config.SearchTableProp.1 ^Ens.Config.SearchTablePropD("EnsLib.EDI.EDIFACT.SearchTable","Identifier"),/ISC/dur/mgr/IHSFOIARPMS/

Was only able to get so far: 

Namespace: RPMS
You're in namespace RPMS
Default directory is /ISC/dur/mgr/IHSFOIARPMS/
RPMS>S DUZ=1

RPMS>K ^%ZOSF

K ^%ZOSF
^
<PROTECT> ^%ZOSF,/ISC/dur/mgr/IHSFOIARPMS/
RPMS>D ^ZTMGRSET

ZTMGRSET Version 8.0 Patch level **34,36,69,94,121,127,136,191,275,355,446,584**
HELLO! I exist to assist you in correctly initializing the current account.

This is namespace or uci RPMS,EXTERNAL.
Should I continue? N//Y
I think you are using OpenM-NT
Which MUMPS system should I install?

1 = VAX DSM(V6), VAX DSM(V7)
2 = MSM-PC/PLUS, MSM for NT or UNIX
3 = Cache (VMS, NT, Linux), OpenM-NT
4 = 
5 = 
6 = 
7 = GT.M (VMS)
8 = GT.M (Unix)
System: 3//
 K ^%ZOSF("MASTER"),^("SIGNOFF") ;Remove old nodes.
 ^
<PROTECT>A+12^ZTMGRSET ^%ZOSF("MASTER"),/ISC/dur/mgr/IHSFOIARPMS/
RPMS 2d1>D ^ZUSET

This routine will rename the correct routine to ZU for you.

Rename ZUONT to ZU, OK? No//Y
 K ^TMP($J)
 ^
<PROTECT>DO+2^ZUSET ^TMP(24714),/ISC/dur/mgr/IHSFOIARPMS/
RPMS 5d1>

This is a permission issue.   The ^ZUSET routine needs to be able to write to the database and cant because it was mounted read-only because of the IRIS.lck issue.   There is a permission issue at the linux level on the directory where your database is stored.   Need to make sure it's set properly so that the user which IRIS runs under has write permissions to the directory.

Then you can unmount and remount the database and it should solve your problem.

Here is my permissions which I made the same as other IRIS.DAT. Do I have to restart something to make it engage? If so, what is the command? I restarted docker but it did not make a difference. 

intersystems-iris-community-edition-1-vm:/opt/ISC/dur/mgr$ ls -la IHSFOIARPMS/total 3890188drwxrwxr-x 2 root root 4096 Nov 7 14:44 .drwxrwxr-x 10 51773 52773 4096 Nov 12 17:23 ..-rw-r--r-- 1 51773 52773 3983540224 Nov 7 14:46 IRIS.DAT
 

I am quite knowledgeable about Unix/Linux and its permissions but as they say the devil is in the details.  I am the author of the Astronaut VistA installer suite so am something of an authority on the subject for what that is worth now for how the same things are done  (differently) with ISC. Sigh. Here is the relevant output of ps -ef

root 32080 1 0 17:23 ? 00:00:05 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sroot 32252 32080 0 17:23 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 52773 root 32268 32080 0 17:23 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 51773 root 32276 1338 0 17:23 ? 00:00:03 containerd-shim -namespace moby -workdir /var/lib/containerd/io.con51773 32305 32276 0 17:23 ? 00:00:00 /iris-main