Backport eCQM to Astronaut VistA.

Primary tabs

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

  • 0
  • 0
  • 79
  • 20
  • 2

Answers

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.  

I have IHS FOIA CACHE.DAT on the ubuntu filesystem IRIS cloud instance. I see that other IRIS.DATs exist:

/opt/ISC/dur/mgr/IRIS.DAT
/opt/ISC/dur/mgr/irisaudit/IRIS.DAT
/opt/ISC/dur/mgr/irislocaldata/IRIS.DAT
/opt/ISC/dur/mgr/iristemp/IRIS.DAT
/opt/ISC/dur/mgr/user/IRIS.DAT

Should I overwrite one of those or???

No.   You should place your FOIA CACHE.DAT into it's its own directory and then in the system management portal create a local database and namespace.   When creating the database you will identify the directory where you placed your IRIS.DAT file.

Okay I have created /opt/ISC/dur/mgr/IHSFOIARPMS that contains renamed IRIS.DAT I am in management portal and I see lots and lots of possibilities. I would appreciate more direction but I suspect that very soon the answer will be to read the fine manual but I am also wondering which fine manual?

Made it to here. I have a opaque IRIS.DAT from IHS FOIA. Not sure where to go next or if I am on the right track.

I think it is semi-imported. Documentation says enter DB characteristics but this is an import so I am at this juncture below unsure what to do next. 

Now you need to create a Namespace that uses your RPMS database for routines and globals.

Refer to the doc link I sent earlier on Creating Namespaces.

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/

It seems to be configured. It will need a search/replace on approximately 280 instances of the word Cache replace with IRIS in the code base. How is this accomplished in this environment? The first time I ever did a code search/replace like this was on a Data General Eclipse in about 1983 and I can grep. :-)

 -- IV

You could do one of a couple things.

1.Export all the ROUTINES to a file using %RO and then use a linux tool or something else to make the global replace

or

2.Simply use the %RCHANGE utility at the IRIS command prompt to do the global routine change.   I certainly would recommend verifying each change.

Getting this: This database is mounted as read-only due to 'Failed to access iris.lck file' I see on the file system that these seem to be one liners with some binary. How do I generate this?

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
 

What user is IRIS running a

Do a ps -ef and make sure the user listed for all of the Iris processes has write permissions to the directory.

Do you have anyone that has worked with ISC technology before or Linux?   If not I would suggest perhaps getting someone with a little experience here.

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
 

I'm going to allow someone more familiar with Docker answer this.   It's clearly a permissions issue biut is it a issue inside or outside the container?   I don't know