Oliver Wilms · Feb 14, 2023 go to post

My team uses Podman to build images and run containers. What exactly are you trying to accomplish? podman and docker should be mostly interchangeable. If you have a docker run command, you should be able to do the same using podman instead of docker

Oliver Wilms · Feb 15, 2023 go to post

I just tried the same command and I got unauthorized error. The client does not have permission for manifest. Did you login to containers.intersystems.com before you tried the podman run?

Oliver Wilms · Feb 15, 2023 go to post

I just searched history and found these commands somebody else had used. Maybe some could help you:

sudo podman login containers.intersystems.com

sudo podman search containers.intersystems.com/intersystems/irishealth

sudo podman image list  containers.intersystems.com/intersystems/irishealth

sudo podman pull containers.intersystems.com/intersystems/webgateway-arm64:2022.2.0.372.0

sudo podman search --list-tags containers.intersystems.com/intersystems/arbiter-arm64

Oliver Wilms · Feb 15, 2023 go to post

I just logged in containers.intersystems.com from browser. Somehow podman login does not work. I see images under arbiter. I think you should try to add a tag to your run such as arbiter:2023.1.0.185.0 ...

Oliver Wilms · Mar 7, 2023 go to post

Hello, Scott, ZSTOP can be used to define additional code you want to run at shutdown. The normal shutdown will still happen if you have ZSTOP routine.

Oliver Wilms · Mar 13, 2023 go to post

Joe,

If your input is a JSON file, the business service could be a File Service which passes Ens.StreamContainer request object to a business process where you could transform the request to an HL7 message which can be sent to a HL7 operation.

Oliver Wilms · Mar 14, 2023 go to post

Hi, Martin,

You receive a request via EnsLib.Http.GenericService. I assume you pass the EnsLib.HTTP.GenericMessage request object to a business process. I think you look for an example how to return the response. Let me look for an example ...

Oliver Wilms · Mar 14, 2023 go to post

Class HS.Local.Example.ProcessBPL Extends Ens.BusinessProcessBPL
{Storage Default
{
<Type>%Storage.Persistent</Type>
}/// BPL Definition
XData BPL [ XMLNamespace = "http://www.intersystems.com/bpl]
{
<process language='objectscript' request='EnsLib.HTTP.GenericMessage' response='EnsLib.HTTP.GenericMessage' height='2000' width='2000' >
<context>
<property name='SuccessResponse' type='%String' instantiate='0' >
<parameters>
<parameter name='MAXLEN'  value='50' />
</parameters>
</property>
<property name='ConvertedStream' type='Ens.StreamContainer' instantiate='0' />
</context>
<sequence xend='200' yend='1000' >
<code name='ConvertedStream' xpos='200' ypos='250' >
<![CDATA[ If 1=request.%IsA("Ens.StreamContainer") {
   Set context.ConvertedStream = request
 }
 If 1=request.%IsA("EnsLib.HTTP.GenericMessage") {
   Set context.ConvertedStream = ##class(Ens.StreamContainer).%New()
   Set context.ConvertedStream.Stream = ##class(%GlobalCharacterStream).%New()
   Set tSC = context.ConvertedStream.Stream.CopyFrom(request.Stream)
   Set context.ConvertedStream.OriginalFilename = $Piece(request.HTTPHeaders.GetAt("RawParams"),"=",2)
 }
 If 1=request.%IsA("EnsLib.Kafka.Message") {
   Set context.ConvertedStream = ##class(Ens.StreamContainer).%New()
   Set context.ConvertedStream.Stream = ##class(%GlobalCharacterStream).%New()
   Set tSC = context.ConvertedStream.Stream.Write(request.value)
   Set context.ConvertedStream.OriginalFilename = request.key
   Set tSC = context.ConvertedStream.%Save()
 }]]>
</code>
<if name='Check Test Transaction' condition='context.ConvertedStream.OriginalFilename="TEST.txt"' xpos='200' ypos='350' xend='200' yend='700' >
<false>
<code name='Store Document' xpos='335' ypos='500' disabled="false">
<![CDATA[ Set tSC = ##class(HS.Local.VA.eSCM.FMS.Util).StoreStream(context.ConvertedStream,context.ConvertedStream)]]>
</code>
<call name='Call ToIrisMail Operation' target='ToIrisMail' async='0' xpos='335' ypos='600' >
<request type='Ens.StreamContainer>
<assign property="callrequestvalue="context.ConvertedStreamaction="set" />
</request>
<response type='EnsLib.HTTP.GenericMessage/>
</call>
</false>
</if>
<code name='setting of success response' xpos='200' ypos='800' >
<![CDATA[ Set context.SuccessResponse = ""
 If 1=request.%IsA("EnsLib.HTTP.GenericMessage") {
   Set tmp = ##class(%Library.GlobalBinaryStream).%New()
   Set tSC = tmp.Write("File received successfully")
   Set tSC = tmp.%Save()
   Set context.SuccessResponse=##class(EnsLib.HTTP.GenericMessage).%New(tmp,,request.HTTPHeaders)
   Do context.SuccessResponse.HTTPHeaders.SetAt("HTTP/1.1 200 OK","StatusLine")
   Set tSC = context.SuccessResponse.%Save()
 }]]>
</code>
<assign name="send response back" property="responsevalue="context.SuccessResponseaction="set" xpos='200' ypos='900' />
</sequence>
</process>
}}
 

Oliver Wilms · Mar 20, 2023 go to post

I tried to implement in HL7 production created by New Production wizard. I think we cannot process Ens.StreamContainer using RoutingRule because Ens.StreamContainer does not have DocType property.

Going to try with a BPL Business Process ...

Oliver Wilms · Mar 21, 2023 go to post

I think I get parsing error because of bad data in my input file:

{""Doctype"":""ADT^A01"",""PatientId"":""123"",""PatientName"":""Alex""}

I will try with removing the extra quotes.

Oliver Wilms · Mar 21, 2023 go to post

Joe,

I created a HL7 production, added JSON Passthrough File Service. Use BPL and DTL to transform Ens.StreamContainer to HL7 Message. Code is here:

https://github.com/oliverwilms/HL7

Input test file I use this (no double double quotes):

{"Doctype":"ADT^A01","PatientId":"123","PatientName":"Alex"}

I see PatientId in HL7 message, but not PatientName. Need to review the DTL ...

Oliver Wilms · Mar 21, 2023 go to post

I created a class for dynamic query:

Class otw.dynq

{

ClassMethod prepareQ() As %Status

{

    Set result=##class(%ResultSet).%New("%DynamicQuery:SQL")

    Set sc=result.Prepare("SELECT %ID, Name, Salary FROM Sample.Employee WHERE Salary > ?")

    If $$$ISERR(sc) {

        // here I want to capture the error details in trace , log , that I can see in production web page

        Try {

            Do ##class(%SYS.System).WriteToConsoleLog("%ZSTART Routine: "_"Import Users",0,0)

        } Catch exception {

            Do BACK^%ETN // Log error in error log

        }

    }

    Quit sc

}

}

I call the Dynamic Query Prepare from BPL and Trace the Status Text from the Prepare:

///

Class otw.bplJSON2HL7 Extends Ens.BusinessProcessBPL

{

/// BPL Definition

XData BPL [ XMLNamespace = "http://www.intersystems.com/bpl" ]

{

<process language='objectscript' request='Ens.Request' response='Ens.Response' height='2000' width='2000' >

<context>

<property name='dynPrepareStatus' type='%Library.Status' instantiate='0' />

</context>

<sequence xend='200' yend='750' >

<trace name='request.Stream.Read()' value='request.Stream.Read()' xpos='200' ypos='250' />

<assign name="dynPrepareStatus" property="context.dynPrepareStatus" value="##class(otw.dynq).prepareQ()" action="set" xpos='200' ypos='350' />

<trace name='dynPrepareStatus' value='$System.Status.GetOneStatusText(context.dynPrepareStatus)' xpos='200' ypos='450' />

<transform name='otw.dtlJSON2HL7' class='otw.dtlJSON2HL7' source='request' target='response' xpos='200' ypos='550' />

<call name='HL7FileOperation' target='HL7FileOperation' async='1' xpos='200' ypos='650' >

<request type='Ens.Request' >

<assign property="callrequest" value="response" action="set" />

</request>

<response type='Ens.Response' />

</call>

</sequence>

</process>

}

Storage Default

{

<Type>%Storage.Persistent</Type>

}

}

The code is in this GitHub repo:

https://github.com/oliverwilms/HL7

Oliver Wilms · Mar 21, 2023 go to post

The error from Prepare will write to messages.log with this change:

Class otw.dynq

{

ClassMethod prepareQ() As %Status

{

    Set result=##class(%ResultSet).%New("%DynamicQuery:SQL")

    Set sc=result.Prepare("SELECT %ID, Name, Salary FROM Sample.Employee WHERE Salary > ?")

    If $$$ISERR(sc) {

        // here I want to capture the error details in trace , log , that I can see in production web page

        Try {

            Set x = $System.Status.GetOneStatusText(sc)

            Do ##class(%SYS.System).WriteToConsoleLog("otw.dynq prepareQ: "_x)

        } Catch exception {

            Do BACK^%ETN // Log error in error log

        }

    }

    Quit sc

}

}

Oliver Wilms · Mar 23, 2023 go to post

pInput As Patient.PatientDBReq is automatically persisted. You do not need to explicitly call %Save()

Oliver Wilms · Mar 23, 2023 go to post

I understand your original question was why the data was saved twice. I would try to comment out the %Save() and see if you get new data one time.

Oliver Wilms · Mar 23, 2023 go to post

The object is passed to the SQL Outbound operation. It is a Ens.StreamContainer and Ens.Request which are automatically persisted, meaning saved into the table.

Oliver Wilms · Apr 14, 2023 go to post

My dynamic object contains three properties, like this:

Set dynObject1.Filename = "myzipfile.gz"

Set dynObject1.SiteId = "123"

But how can I say dynObject1.Stream = request.Stream which contains large binary stream?

Oliver Wilms · Apr 18, 2023 go to post

I decided to just send the filename and then the compute pod can Read the file on a shared volume.

Oliver Wilms · Apr 21, 2023 go to post

I fixed the error running audit-consolidator in AWS by adjusting directory permissions. irisowner did not have write permissions on /home/irisowner/irisdev directory until I ran "chmod 777 ."

Oliver Wilms · Apr 21, 2023 go to post

Hello, I have written two articles and I will write one more. I also deployed online demo for audit-consolidator. Thank you

Oliver Wilms · Apr 22, 2023 go to post

I like that ZPM Package Manager automatically imports what is defined in requirements.txt for Python.

Oliver Wilms · Apr 22, 2023 go to post

I do not see any bonus for audit-consolidator. I wrote 3 articles. I created online demo. I am trying to upload my video.

Oliver Wilms · Jun 30, 2023 go to post

Thank you, Evgeny, for pointing out how to update user(s) by using CPF Merge. I still like to have an option to configure a group of users in a single file and import this group of users with their passwords into several different IRIS instances which may use different CFP Merge files already. If there is a change to my users, I just update the XML file which gets imported using %ZSTART routine whenever any IRIS instance starts.

Oliver Wilms · Nov 12, 2023 go to post

It appears the servers have different hostnames (a and b), but the certificate has only the server a. You need a second SSL certificate for server b or get a certificate that includes both server names.

Oliver Wilms · Nov 19, 2023 go to post

Date, time, process / job id, log level, event type, log message.

Log level 0 is normal, 2 is warning, 3 is critical