Skip to content

Commit def6ddd

Browse files
committed
Update for ibmmq format
1 parent a991ded commit def6ddd

File tree

5 files changed

+48
-8
lines changed

5 files changed

+48
-8
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ data:
119119
queue_name: YOUR.QUEUE
120120
username: your-username
121121
password: your-password
122+
# message_format: MQHRF2
123+
# message_ccsid: 1208
122124
poll_interval_ms: 100
123125
- name: ibm_to_kubemq
124126
type: ibm_mq_to_kubemq
@@ -158,7 +160,7 @@ spec:
158160
spec:
159161
containers:
160162
- name: kubemq-ibmmq-connector
161-
image: europe-docker.pkg.dev/kubemq/images/ibm-mq-connector:v0.1.0
163+
image: europe-docker.pkg.dev/kubemq/images/ibm-mq-connector:v0.4.0
162164
volumeMounts:
163165
- name: config-volume
164166
mountPath: /app/config.yaml

Taskfile.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
version: '3'
44

55
vars:
6-
VERSION: v0.2.0
6+
VERSION: v0.4.0
77
IMAGE_NAME: europe-docker.pkg.dev/kubemq/images/ibm-mq-connector
88

99
tasks:
@@ -42,3 +42,6 @@ tasks:
4242
cmds:
4343
- kubectl config use-context gke_ji-portal-v2_us-central1_ai-agent-cluster
4444
- kubectl apply -k . -n default
45+
deploy-ibmmq:
46+
cmds:
47+
- docker run --env LICENSE=accept --env MQ_QMGR_NAME=QM1 --publish 1414:1414 --publish 9443:9443 --detach --env MQ_APP_PASSWORD=passw0rd ibmcom/mq:latest

depolyments/k8s/config.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ data:
2020
queue_name: SECUREAPP.QUEUE
2121
username: admin
2222
password: Passw0rd
23+
# message_format: MQHRF2
24+
# message_ccsid: 870
2325
poll_interval_ms: 100
2426
2527
- name: ibm_to_kubemq

src/ibm_mq/client.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ def _connect(self):
5656
"cd": cd,
5757
"opts": connect_options,
5858
"user": self.config.username.encode("utf-8"),
59-
"password": self.config.password.encode("utf-8"),
59+
"password": (
60+
self.config.password.encode("utf-8") if self.config.password else ""
61+
),
6062
}
6163

6264
if sco is not None:
@@ -80,8 +82,6 @@ def _connect(self):
8082
self.is_connected = True
8183
self.logger.info("Connected to IBM MQ")
8284

83-
84-
8585
def _disconnect(self):
8686
try:
8787
if not self.is_connected:
@@ -156,7 +156,11 @@ async def send_message(self, message: bytes):
156156
async def _send_message():
157157
try:
158158
self.logger.info("Sending message to IBM MQ")
159-
await asyncio.to_thread(self.queue.put, message)
159+
md = pymqi.MD()
160+
md.Format = self.config.get_md_format()
161+
if self.config.message_ccsid > 0:
162+
md.CodedCharSetId = self.config.message_ccsid
163+
await asyncio.to_thread(self.queue.put, message, md)
160164
self.logger.info("Message sent successfully")
161165
except Exception as e:
162166
self.logger.error(f"Error sending message: {str(e)}")

src/ibm_mq/config.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Optional
22

33
from pydantic import BaseModel, Field, model_validator
4+
import pymqi
45

56

67
class Config(BaseModel):
@@ -13,8 +14,8 @@ class Config(BaseModel):
1314
queue_name: str = Field(default=None, description="Queue name")
1415
username: str = Field(default=None, description="Username")
1516
password: Optional[str] = Field(default=None, description="Password")
16-
message_ccsid: int = Field(default=1208, description="CCSID")
17-
message
17+
message_ccsid: Optional[int] = Field(default=1208, description="CCSID")
18+
message_format: Optional[str] = Field(default="", description="Message format")
1819
poll_interval_ms: int = Field(
1920
default=100, ge=1, description="Poll interval in milliseconds"
2021
)
@@ -38,3 +39,31 @@ def validate_ssl_fields(self):
3839
if not self.key_repo_location:
3940
raise ValueError("key_repo_location is required when ssl is True")
4041
return self
42+
43+
def get_md_format(self) -> bytes:
44+
format_map = {
45+
"": pymqi.CMQC.MQFMT_NONE,
46+
"MQADMIN": pymqi.CMQC.MQFMT_ADMIN,
47+
"MQAMQP": pymqi.CMQC.MQFMT_AMQP,
48+
"MQCHCOM": pymqi.CMQC.MQFMT_CHANNEL_COMPLETED,
49+
"MQCICS": pymqi.CMQC.MQFMT_CICS,
50+
"MQCMD1": pymqi.CMQC.MQFMT_COMMAND_1,
51+
"MQCMD2": pymqi.CMQC.MQFMT_COMMAND_2,
52+
"MQDEAD": pymqi.CMQC.MQFMT_DEAD_LETTER_HEADER,
53+
"MQHDIST": pymqi.CMQC.MQFMT_DIST_HEADER,
54+
"MQHEPCF": pymqi.CMQC.MQFMT_EVENT,
55+
"MQEVENT": pymqi.CMQC.MQFMT_EVENT,
56+
"MQIMS": pymqi.CMQC.MQFMT_IMS,
57+
"MQIMSVS": pymqi.CMQC.MQFMT_IMS_VAR_STRING,
58+
"MQHMDE": pymqi.CMQC.MQFMT_MD_EXTENSION,
59+
"MQPCF": pymqi.CMQC.MQFMT_PCF,
60+
"MQHREF": pymqi.CMQC.MQFMT_REF_MSG_HEADER,
61+
"MQHRF": pymqi.CMQC.MQFMT_RF_HEADER,
62+
"MQHRF2": pymqi.CMQC.MQFMT_RF_HEADER_2,
63+
"MQSTR": pymqi.CMQC.MQFMT_STRING,
64+
"MQTRIG": pymqi.CMQC.MQFMT_TRIGGER,
65+
"MQHWIH": pymqi.CMQC.MQFMT_WORK_INFO_HEADER,
66+
"MQXMIT": pymqi.CMQC.MQFMT_XMIT_Q_HEADER,
67+
}
68+
clean_format = self.message_format.strip().upper()
69+
return format_map.get(clean_format, pymqi.CMQC.MQFMT_NONE)

0 commit comments

Comments
 (0)