I wasn't sure what RPMS was, but a Google search tells me it's an application for Indian Health Service. Are you trying to migrate the app from Caché to IRIS? Or is it already on IRIS and you want to know how to run it inside a Docker container? Or none of the above? The steps would be different depending on your answer.

Given that we're pretty far nested into a comment thread on an unrelated topic, I would recommend you either create a new DC post with more detail/background, or contact your Sales Engineer for advice on how to proceed with your migration or project.

Steve

Hi Stefan,

I believe Fabian was describing creating a new image, based off of the default InterSystems image, but modifying the user and group. (By the way, even though you are on Docker for Windows, InterSystems IRIS images are based on Ubuntu, and Docker for Windows runs in a Linux VM) The excerpt above would be placed in a new Dockerfile and you would build a new custom image. This approach is described here: https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_creating

However, may I ask, what version of InterSystems IRIS are you using? I have seen these "Sign-on inhibited" errors frequently in the past, but I think they've been mitigated in recent versions.  2019.3 was just released, and should be available in the Docker Store and cloud marketplaces in the next few days.

-Steve

I'm not sure why that would be, and I'm not able to reproduce it.

The IRIS for Health Community instance on GCP has not yet been updated to the latest 2019.4 preview build. The standard IRIS Community instance has, and that appears to work out of the box for me. I'm told that the IRIS for Health listings should be updated in the next few days as well.

Hi Ignacio,

It looks like the container does not run automatically by the GCP launcher.  I was able to start it manually:

leblanc@intersystems-iris-health-community-editio-2-vm:~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
leblanc@intersystems-iris-health-community-editio-2-vm:~$ sudo docker images
REPOSITORY                TAG                   IMAGE ID            CREATED             SIZE
intersystems/irishealth   2019.1.0S.111.0-gcp   a39d75e7a42b        9 months ago        1.61GB
leblanc@intersystems-iris-health-community-editio-2-vm:~$ sudo docker run -d -p 52773:52773 --name iris --init intersystems/irishealth:2019.1.0S.111.0-gcp
1932a6736c70d5e5dbd604b040f11907e8cdffa0aaccbbfce14bc37114c1ec46
 

Then I can launch the Management Portal, log in with SuperUser/SYS (then prompted to change my password), and use the instance.

I'll follow up internally to make sure the environment launches as intended, or at least see that the instructions are modified if this is how it is intended to work.

-Steve

Hi James,

Why do you need to convert the HL7 message to a stream at all?  You can use EnsLib.HL7.Operation.HTTPOperation, which expects a message of type EnsLib.HL7.Message, and handle the conversion and HTTP POST for you. Then you can apply HL7 routing rules and transformations in your production, and see the HL7 parsed out with the appropriate schema overlaid in the message trace.

Steve

Does your router apply a data transformation to map the Record Map into an object of type EnsLib.EDI.XML.Document? If you have a schema for the target XML format, you can import that into Ensemble under Interoperate > XML > XML Schema Structures, and then create a Data Transformation to go from your Record Map to an EnsLib.EDI.XML.Document, with your imported schema.  Then send the result to your XML FileOperation, as that should be in the format that the operation expects.

There's no Service/Operation setting to do this automatically.  Warnings are written to the Event Log, so one approach that has been recommended before is to set up a task that mines the Event Log periodically to find new warnings, and handle them that way.

Are there specific warnings that you're concerned about? If it's something that you want to be alerted, perhaps those should be considered errors and not warnings.

Scott,

While there's nothing officially supported in the product, I've pulled some code from a sample that a colleague wrote years ago that should do what you need.  Please note that I have not personally tested this code, and since it is not part of the product, it has not been through any QA testing by InterSystems, so you would need to test and use at your own risk.

/// This method takes in an UUencoded GlobalCharacterStream and 
/// returns an UUdecoded GlobalBinaryStream. 
/// UUencoding is a form of binary-to-text encoding that originated in the Unix program 
/// uuencode, for encoding binary data for transmission over the uucp mail system. 
/// The name "uuencoding" is derived from "Unix-to-Unix encoding". Since uucp converted 
/// characters between various computers' character sets, uuencode was used to convert 
/// the data to fairly common characters that were unlikely to be "translated" and 
/// thereby destroy the file. This method UUDECODE reverses the effect of uuencode, 
/// recreating the original binary file exactly.
/// ref.: http://en.wikipedia.org/wiki/Uuencoding
Method UUDECODE(ByRef sUUE As %GlobalCharacterStream, Output sUUD As %GlobalBinaryStream) As %String
{
 S UUDFilename=""
 D sUUE.Rewind()
 S data=sUUE.ReadLine()
 // A file in uuencoded format starts with a header line of the form:
 // begin (mode) (filename)
 // where (mode) is the file's Unix read/write/execute permissions as three octal digits,
 // and (filename) is the name to be used when recreating the binary data. 
 S data=$e(data,$f(data,"begin"),$l(data))
 F {
	 Q:" 01234567"'[$e(data,1,1)
	 S $e(data,1,1)=$tr($e(data,1,1)," 01234567","") ; ignore (mode)
 }
 S UUDFilename=data
 
 While('sUUE.AtEnd) {
	 S data=sUUE.ReadLine() 
	 // The file ends with two trailer lines:
	 // `
	 // end
	 // (The grave accent indicates a line that encodes zero bytes)
	 Q:data="end"
	 
	 // Each data line starts with a character indicating the number of data bytes 
	 // encoded on the line and ends with a newline character. All data lines,
	 // except perhaps the last, encode 45 bytes of data. The corresponding encoded
	 // length value is 'M' (see uudec() below), so most lines begin with 'M'.
	 S n=$$uudec($e(data,1,1))
	 
	 // Each group of four bytes will be decoded back to a 24-bit value. This
	 // 24-bit value is formed by 4 groups of 6-bit values, each corresponds
	 // to every byte in the encoded group. 
	 F i=2:4:$L(data)
	 {
		 Q:n<=0
		 if n>=1 {
			 ; decode(first 6-bit)<<2 | decode(second 6-bit)>>4
			 ;        first 6-bit: 00XXXXXX --> XXXXXX00
			 ;       second 6-bit: 00YYbbbb --> 000000YY 
			 ; first decoded byte: XXXXXXYY
			 S ch=$zb($zb($$uudec($e(data,i,i))*4,255,1),$$uudec($e(data,i+1,i+1))\16,7) 
			 D sUUD.Write($c(ch))
		 }
		 if n>=2 {
			 ; decode(second 6-bit)<<4 | decode(third 6-bit)>>2
			 ;        second 6-bit: 00bbXXXX --> XXXX0000
			 ;         third 6-bit: 00YYYYbb --> 0000YYYY
			 ; second decoded byte: XXXXYYYY
			 S ch=$zb($zb($$uudec($e(data,i+1,i+1))*16,255,1),$$uudec($e(data,i+2,i+2))\4,7) 
			 D sUUD.Write($c(ch))
		 }
		 if n>=3 {
			 ; decode(third 6-bit)<<6 | decode(fourth 6-bit)
			 ;        third 6-bit: 00bbbbXX --> XX000000
			 ;       fourth 6-bit:              00YYYYYY
			 ; third decoded byte: XXYYYYYY
			 S ch=$zb($zb($$uudec($e(data,i+2,i+2))*64,255,1),$$uudec($e(data,i+3,i+3)),7) 
			 D sUUD.Write($c(ch))
		 }
		 S n=n-3
	 }
 }
 Q UUDFilename
 
 // Each uuencoded byte has a range of values from 0 to 63. When 32 is added, 
 // the ASCII characters will lie in the range 32 (space) to 95 (underscore).
 // ASCII characters greater than 95 may also be used, but only the six 
 // right-most bits are relevant. Since the space character is deemed 
 // problematic for data transmission, so the grave accent (` or ASCII 96) is
 // used to represent the encoded zero value. 
uudec(ch)
	Q $zb($a(ch)-32,63,1) ; 6 bits AND
}

Tom,

I presume by now you've had this answered by the WRC, but the issue is most likely that the private Apache web server that ships with Caché/Ensemble does not currently support SSL.  In order to configure SSL, you would need to configure a full Apache or IIS web server, which is typically recommended for any public-facing, production-level deployment anyway.

-Steve

Hi,

Thanks for your response.  I'm not necessarily asking HOW to do this, but rather I'm interested in whether or not this is something you SHOULD do.  Should these outgoing calls go through the ESB, or should the calls just be made directly from the back-end Caché application?  I suppose you gain tracing/monitoring capabilities, but is it worth the extra stop/point of failure?

Thanks,

Steve

Hi,

There are a few ways.  Are you using Caché or Ensemble?

In Ensemble, you can use a REST Operation, as described here:  http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=...

In a Caché class, you can use the %Net.HttpRequest class to issue any GET/POST request to a REST URL:  http://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?P...

Steve