jetstream-api 0.27.1__tar.gz → 0.28.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/PKG-INFO +15 -1
  2. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/README.md +14 -0
  3. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/__init__.py +1 -1
  4. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/admin.py +5 -1
  5. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/common.py +4 -0
  6. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/properties.py +40 -9
  7. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/jetstream_api.egg-info/PKG-INFO +15 -1
  8. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/pyproject.toml +1 -1
  9. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/LICENSE.txt +0 -0
  10. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/_codec.py +0 -0
  11. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/_consumer.py +0 -0
  12. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/_groupwire.py +0 -0
  13. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/_propv2.py +0 -0
  14. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/_qleader.py +0 -0
  15. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/_throttle.py +0 -0
  16. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/admintopic.py +0 -0
  17. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/connectivity.py +0 -0
  18. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/exception.py +0 -0
  19. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/msg.py +0 -0
  20. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/partitioner.py +0 -0
  21. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/pattern.py +0 -0
  22. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/producer.py +0 -0
  23. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/py.typed +0 -0
  24. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/qmgr.py +0 -0
  25. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/topic.py +0 -0
  26. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/ilink/util.py +0 -0
  27. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/jetstream_api.egg-info/SOURCES.txt +0 -0
  28. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/jetstream_api.egg-info/dependency_links.txt +0 -0
  29. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/jetstream_api.egg-info/requires.txt +0 -0
  30. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/jetstream_api.egg-info/top_level.txt +0 -0
  31. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/setup.cfg +0 -0
  32. {jetstream_api-0.27.1 → jetstream_api-0.28.0}/tests/test_example.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jetstream-api
3
- Version: 0.27.1
3
+ Version: 0.28.0
4
4
  Summary: Python client API for iLink M.O.M. (Message Oriented Middleware)
5
5
  Author: snowjeans
6
6
  License: Boost Software License - Version 1.0 - August 17th, 2003
@@ -60,6 +60,20 @@ lz4 배치 압축을 쓰려면 `pip install "jetstream-api[lz4]"`, zstd 배치
60
60
  ## 설치 방법
61
61
  pip install jetstream-api
62
62
 
63
+ ## 0.28.0 변경 - IBMMQ 채널 MQ 인증 · 채널 사유(REASON) · 입력값 오류 표시 (자바 v2.24.0 와 같음, 짝 엔진 7.0.1.3638 이상)
64
+
65
+ - 새 칸: IBMMQ 채널 MQ CONNAUTH ``mqUser`` · ``mqPassword`` (엔진 7.0.1.3638 이상). 둘은 한 쌍이다(한쪽만 있으면 엔진이 ``MIMQE_INVALID_PROPERTY``,
66
+ 걷으려면 둘 다 ``""``). ``mqPassword`` 는 비밀 칸이다 - 조회하면 ``"*****"`` (없으면 ``""``), ``"*****"`` 를 되보내면 그대로 유지, ``""`` 는 지우기,
67
+ ``"{ARIA}<hex>"`` 는 봉인값으로 받는다. 클라는 비밀번호 길이를 검사하지 않고 사람이 읽는 요약에 찍지 않는다. 빈 인증 칸은 CREATE 에 싣지 않는다.
68
+ - 새 칸: 채널 읽기 전용 ``reason`` (엔진 7.0.1.3637 이상, 최대 69자) - ERROR · STOPPED 가 된 사유(``"stopped by ..."`` · MQ cc/rc · ``"follower node"``).
69
+ RUNNING · STARTING 이면 빈칸이다. MQ 인증 실패는 ``MQCONNX failed cc=2 rc=2035 (auth: ...)`` 로 보인다.
70
+ - 채널 목록(``getChannelList``)은 ``REASON`` 을 7.0.1.3637 이상, 인증 칸을 7.0.1.3638 이상 엔진에만 묻는다(``ILC.CHANNEL_REASON_MIN_REVISION`` · ``ILC.IBMMQ_AUTH_MIN_REVISION``).
71
+ - IBMMQ 채널 흐름(엔진 7.0.1.3634 이상): START 가 실제 MQ 흐름을 띄운다(3633 · MQ SDK 없이 지은 엔진은 ``MIMQE_UNSUPPORTED``).
72
+ START 를 받아들인 뒤의 MQ 연결 실패는 채널 ERROR + 엔진 자동 재시도, STOP 은 1초 안에 STOPPED, MsgId · CorrelId 는 24바이트 <-> base64url 32자.
73
+ 클러스터 팔로워의 IBMMQ 채널은 START 해도 STANDBY 로 남는다(REASON ``"follower node"``).
74
+ - 고침: 보내기 전에 막는 열거 코드 오류(ACL ``type`` · 큐 관리자 ACLTYPE/STARTMODE · 서비스 TYPE/ACLTYPE · 로그 레벨 0~7 밖)가
75
+ ``MIMQC_FATAL_ERROR (MIMQE_INTERNAL_ERROR)`` 로 감싸여 보였다 - 이제 ``UnsupportedOperationException`` (``[v] is an unacceptable value. ...``) 그대로다.
76
+
63
77
  ## 0.27.1 변경 - 기동 · 정지 중 큐 관리자 조회 (자바 v2.23.1 와 같음, 짝 엔진 7.0.1.3633 이상)
64
78
 
65
79
  0.27.0 은 시험 판(test.pypi)만 내고 버렸다 - 회귀에서 아래 결함이 나왔다.
@@ -10,6 +10,20 @@ lz4 배치 압축을 쓰려면 `pip install "jetstream-api[lz4]"`, zstd 배치
10
10
  ## 설치 방법
11
11
  pip install jetstream-api
12
12
 
13
+ ## 0.28.0 변경 - IBMMQ 채널 MQ 인증 · 채널 사유(REASON) · 입력값 오류 표시 (자바 v2.24.0 와 같음, 짝 엔진 7.0.1.3638 이상)
14
+
15
+ - 새 칸: IBMMQ 채널 MQ CONNAUTH ``mqUser`` · ``mqPassword`` (엔진 7.0.1.3638 이상). 둘은 한 쌍이다(한쪽만 있으면 엔진이 ``MIMQE_INVALID_PROPERTY``,
16
+ 걷으려면 둘 다 ``""``). ``mqPassword`` 는 비밀 칸이다 - 조회하면 ``"*****"`` (없으면 ``""``), ``"*****"`` 를 되보내면 그대로 유지, ``""`` 는 지우기,
17
+ ``"{ARIA}<hex>"`` 는 봉인값으로 받는다. 클라는 비밀번호 길이를 검사하지 않고 사람이 읽는 요약에 찍지 않는다. 빈 인증 칸은 CREATE 에 싣지 않는다.
18
+ - 새 칸: 채널 읽기 전용 ``reason`` (엔진 7.0.1.3637 이상, 최대 69자) - ERROR · STOPPED 가 된 사유(``"stopped by ..."`` · MQ cc/rc · ``"follower node"``).
19
+ RUNNING · STARTING 이면 빈칸이다. MQ 인증 실패는 ``MQCONNX failed cc=2 rc=2035 (auth: ...)`` 로 보인다.
20
+ - 채널 목록(``getChannelList``)은 ``REASON`` 을 7.0.1.3637 이상, 인증 칸을 7.0.1.3638 이상 엔진에만 묻는다(``ILC.CHANNEL_REASON_MIN_REVISION`` · ``ILC.IBMMQ_AUTH_MIN_REVISION``).
21
+ - IBMMQ 채널 흐름(엔진 7.0.1.3634 이상): START 가 실제 MQ 흐름을 띄운다(3633 · MQ SDK 없이 지은 엔진은 ``MIMQE_UNSUPPORTED``).
22
+ START 를 받아들인 뒤의 MQ 연결 실패는 채널 ERROR + 엔진 자동 재시도, STOP 은 1초 안에 STOPPED, MsgId · CorrelId 는 24바이트 <-> base64url 32자.
23
+ 클러스터 팔로워의 IBMMQ 채널은 START 해도 STANDBY 로 남는다(REASON ``"follower node"``).
24
+ - 고침: 보내기 전에 막는 열거 코드 오류(ACL ``type`` · 큐 관리자 ACLTYPE/STARTMODE · 서비스 TYPE/ACLTYPE · 로그 레벨 0~7 밖)가
25
+ ``MIMQC_FATAL_ERROR (MIMQE_INTERNAL_ERROR)`` 로 감싸여 보였다 - 이제 ``UnsupportedOperationException`` (``[v] is an unacceptable value. ...``) 그대로다.
26
+
13
27
  ## 0.27.1 변경 - 기동 · 정지 중 큐 관리자 조회 (자바 v2.23.1 와 같음, 짝 엔진 7.0.1.3633 이상)
14
28
 
15
29
  0.27.0 은 시험 판(test.pypi)만 내고 버렸다 - 회귀에서 아래 결함이 나왔다.
@@ -1,6 +1,6 @@
1
1
  """iLink - Python client API for iLink M.O.M. (Message Oriented Middleware)."""
2
2
 
3
- __version__ = "0.27.1"
3
+ __version__ = "0.28.0"
4
4
 
5
5
  # --- Admin / Service ---
6
6
  from .admin import ILAdminService, ILAdminQmgr, ILLogBrowser, ILQueueBrowser
@@ -5665,7 +5665,7 @@ class ILAdminQmgr:
5665
5665
  #: LIST 로 전체 속성을 받을 때의 _KEYS(설정 키 + 읽기 전용 + 목적지 그룹). IBMMQ 전용 키는 IBMMQ 를 아는 엔진에만 묻는다
5666
5666
  #: (모르는 엔진은 "_KEYS[i]" unknown 으로 무시하고 클라가 호출마다 경고를 남기게 된다)
5667
5667
  _CHANNEL_LIST_KEYS = [k for k, _ in ILChannelProperty._PV2_KEYS.values() if k not in ILChannelProperty._PV2_MQ_KEYS] + ["STATUS", "RTT", "DESTGROUP"]
5668
- _CHANNEL_LIST_KEYS_MQ = _CHANNEL_LIST_KEYS + list(ILChannelProperty._PV2_MQ_KEYS)
5668
+ _CHANNEL_LIST_KEYS_MQ = _CHANNEL_LIST_KEYS + [k for k in ILChannelProperty._PV2_MQ_KEYS if k not in ILChannelProperty._PV2_MQ_AUTH_KEYS]
5669
5669
  #: 요약 목록의 _KEYS(요약 클래스의 칸)
5670
5670
  _CHANNEL_MINOR_KEYS = ["TYPE", "DIRECTION", "STATUS", "STARTMODE"]
5671
5671
 
@@ -5681,6 +5681,10 @@ class ILAdminQmgr:
5681
5681
  def _channelListV2(self, ctype=None, direction=None) -> list:
5682
5682
  # 종류 · 방향 거르기는 클라가 한다(옛 3016 arg "CLIENT.SEND" 의 엔진 거르기와 같은 결과)
5683
5683
  keys = ILAdminQmgr._CHANNEL_LIST_KEYS_MQ if self.revision >= ILC.IBMMQ_CHANNEL_MIN_REVISION else ILAdminQmgr._CHANNEL_LIST_KEYS
5684
+ if self.revision >= ILC.CHANNEL_REASON_MIN_REVISION:
5685
+ keys = keys + ["REASON"]
5686
+ if self.revision >= ILC.IBMMQ_AUTH_MIN_REVISION:
5687
+ keys = keys + list(ILChannelProperty._PV2_MQ_AUTH_KEYS)
5684
5688
  cs = self._channelItems(self._channelReq(_propv2.PROP_LIST, {"_KEYS": keys}))
5685
5689
  return [c for c in cs if (ctype is None or c.type == ctype) and (direction is None or c.direction == direction)]
5686
5690
 
@@ -888,6 +888,10 @@ class ILC:
888
888
  TOPIC_LOGGER_MIN_REVISION = 3283
889
889
  #: IBMMQ 채널(TYPE IBMMQ · MQ 전용 키)을 아는 엔진 리비전(다음 판, 엔진 590 CHLMQ-1, 7.0.1.3633). 이보다 낮으면 채널 LIST 에 MQ 키를 묻지 않는다.
890
890
  IBMMQ_CHANNEL_MIN_REVISION = 3633
891
+ #: 채널 읽기 전용 REASON 을 아는 엔진 리비전(다음 판, 엔진 594 CHLREASON-1, 7.0.1.3637). 이보다 낮으면 채널 LIST 에 REASON 을 묻지 않는다.
892
+ CHANNEL_REASON_MIN_REVISION = 3637
893
+ #: IBMMQ 채널 MQ CONNAUTH 칸(MQUSER · MQPASSWORD)을 아는 엔진 리비전(다음 판, 엔진 599 CHLMQAUTH-1, 7.0.1.3638). 이보다 낮으면 채널 LIST 에 묻지 않는다.
894
+ IBMMQ_AUTH_MIN_REVISION = 3638
891
895
 
892
896
  #: ``getLastDiag`` 가 쓰는 진단 조회(3394)가 들어온 엔진 리비전.
893
897
  #: 그 미만 엔진은 이 코드를 모르고 ``MIMQE_INVALID_REQ_CODE`` 를
@@ -1366,6 +1366,11 @@ class ILChannelType(IntEnum):
1366
1366
  SERVER: 상대의 접속을 **받는** 채널.
1367
1367
  IBMMQ: IBM MQ 와 주고받는 채널(다음 판, 엔진 7). 받기(RECV)는 클러스터 리더에서만 일하고 팔로워에서는
1368
1368
  :attr:`ILChannelStatus.STANDBY` 로 대기한다. 이 값을 모르는 옛 클라는 IBMMQ 채널이 섞인 조회 · 목록 자체가 실패한다.
1369
+ 흐름(START)은 엔진 7.0.1.3634 이상에서 돈다(3633 은 START 가 MIMQE_UNSUPPORTED, 와이어는 같다).
1370
+ MQ SDK 없이 지은 엔진도 START 가 MIMQE_UNSUPPORTED (... IBMMQ support is not built into this engine ...) 다.
1371
+ START 를 받아들인 뒤의 MQ 연결 실패는 채널 ERROR 상태가 되고(사유는 큐 관리자 로그),
1372
+ CHANNELRETRYINTERVAL 마다 엔진이 다시 붙는다. STOP 은 1초 안에 STOPPED 가 된다.
1373
+ MsgId · CorrelId: MQ 의 24바이트는 base64url 32자로 바뀌어 들어오고, MQ 로 보낼 때 32자 모양이면 원래 24바이트로 되살린다.
1369
1374
  """
1370
1375
 
1371
1376
  SERVER = 0
@@ -1667,6 +1672,9 @@ class ILChannelProperty(_AutoAccessor):
1667
1672
  스펙: 기본 30 · 범위 -1 또는 1~2147483647 · 단위 초 · 변경 가능/재기동 불필요.
1668
1673
  rtt (int): **읽기 전용** 왕복 지연(밀리초). 측정 전이면 ``-1``.
1669
1674
  스펙: 기본 -1 · 범위 -1~2147483647 (-1=미측정) · 단위 밀리초 · 변경 불가(ReadOnly).
1675
+ reason (str): **읽기 전용** 채널이 ERROR · STOPPED 가 된 사유(다음 판, 엔진 7.0.1.3637 이상의 JSON 에서만, 최대 69자).
1676
+ 예: ``"stopped by <누구>"`` · MQ cc/rc · ``"follower node"`` (클러스터 팔로워의 IBMMQ 채널은 START 해도 STANDBY 로 남는다).
1677
+ RUNNING · STARTING 이 되면 엔진이 비운다. 블롭(6.x)과 그 전 엔진에서는 늘 ``""``.
1670
1678
  traceEnabled (bool): 이 채널의 트레이스 여부. 기본 False.
1671
1679
  스펙: 기본 OFF · 범위 ON | OFF · 변경 가능/재기동 불필요.
1672
1680
  security (ILChannelSecurity): 보안 방식. 기본 ``NONE``.
@@ -1684,6 +1692,13 @@ class ILChannelProperty(_AutoAccessor):
1684
1692
  mqQueue (str): **IBMMQ 전용** MQ 쪽 큐(RECV 일 때 필수). 48바이트 이하.
1685
1693
  ilQueue (str): **IBMMQ 전용** ILink 쪽 큐(RECV 일 때 필수). 47바이트 이하.
1686
1694
  batchSize (int): **IBMMQ 전용** 한 번에 옮길 메시지 수. 기본 10 · 범위 1~1000(판정은 엔진).
1695
+ mqUser (str): **IBMMQ 전용** MQ CONNAUTH 사용자(MQCSP, 다음 판, 엔진 7.0.1.3638 이상). 255바이트 이하. 기본 ``""`` (인증 안 함).
1696
+ ``mqPassword`` 와 한 쌍이다 - 한쪽만 있으면 엔진이 MIMQE_INVALID_PROPERTY 로 거절한다. 인증을 걷으려면 둘 다 ``""`` 로 보낸다.
1697
+ mqPassword (str): **IBMMQ 전용 · 비밀** MQ CONNAUTH 비밀번호(다음 판, 엔진 7.0.1.3638 이상). 평문 256바이트 이하(판정은 엔진).
1698
+ 쓰기 전용처럼 다룬다 - 엔진이 봉인해 저장하고, 조회하면 값이 있을 때 ``"*****"``, 없으면 ``""`` 다.
1699
+ ``"*****"`` 를 보내면 기존 값 유지(조회한 객체를 그대로 되보내도 지워지지 않는다), ``""`` 는 지운다,
1700
+ ``"{ARIA}<대문자 hex>"`` 는 봉인값으로 그대로 받는다. :meth:`__str__` 에는 나오지 않는다.
1701
+ 인증 실패(MQ 2035)는 :attr:`reason` 에 ``MQCONNX failed cc=2 rc=2035 (auth: ...)`` 로 보인다.
1687
1702
  IBMMQ 채널은 엔진 7 JSON 으로만 만들고 바꾼다(블롭은 거절). 보안은 NONE 만, 포트는 1~65535(MQ 기본 1414),
1688
1703
  목적지 그룹 · balanceMode 는 쓰지 않는다(엔진이 무시한다).
1689
1704
  destGroup (list[DestItem]): 분산 대상 목록. 비어 있으면 단일 대상 채널이다.
@@ -1700,7 +1715,7 @@ class ILChannelProperty(_AutoAccessor):
1700
1715
  #: 다음 판 Property v2(엔진 P4, 설계 §15 · 덤프 tests/vectors/propv2_channel_table.json): ``{필드: (와이어 키, 종류)}``.
1701
1716
  #: 종류 ``CHTYPE`` · ``CHDIR`` · ``CHSEC`` · ``CHBAL`` · ``STARTMODE`` 는 와이어 문자열로 바꿔 싣는다(:data:`_CHANNEL_ENUMS`).
1702
1717
  #: 목적지 그룹(``DESTGROUP``)은 표에 없다 - 목록을 제자리에서 고치므로(add_dest) 읽은 사본과 대조해 다르면 통째로 싣는다.
1703
- #: ``status`` · ``rtt`` 는 읽기 전용이라 표에 없다.
1718
+ #: ``status`` · ``rtt`` · ``reason`` 은 읽기 전용이라 표에 없다(보내지 않는다 - 엔진이 READONLY 로 거절한다).
1704
1719
  _PV2_KEYS = {
1705
1720
  "type": ("TYPE", "CHTYPE"),
1706
1721
  "direction": ("DIRECTION", "CHDIR"),
@@ -1722,9 +1737,14 @@ class ILChannelProperty(_AutoAccessor):
1722
1737
  "mqQueue": ("MQQUEUE", "STR"),
1723
1738
  "ilQueue": ("ILQUEUE", "STR"),
1724
1739
  "batchSize": ("BATCHSIZE", "INT"),
1740
+ # 다음 판: MQ CONNAUTH(엔진 599 CHLMQAUTH-1, 7.0.1.3638) - 한 쌍, 비밀번호는 비밀 칸
1741
+ "mqUser": ("MQUSER", "STR"),
1742
+ "mqPassword": ("MQPASSWORD", "STR"),
1725
1743
  }
1726
1744
  #: IBMMQ 전용 칸(와이어 키). 다른 종류 채널의 CREATE · ALTER 본문에는 싣지 않는다(엔진이 "ibmmq-only" 로 무시한다).
1727
- _PV2_MQ_KEYS = ("MQCHL", "MODE", "MQINSTALLPATH", "MQQUEUE", "ILQUEUE", "BATCHSIZE")
1745
+ _PV2_MQ_KEYS = ("MQCHL", "MODE", "MQINSTALLPATH", "MQQUEUE", "ILQUEUE", "BATCHSIZE", "MQUSER", "MQPASSWORD")
1746
+ #: 그중 MQ CONNAUTH 칸(엔진 7.0.1.3638 부터). CREATE 에는 빈칸이면 싣지 않는다 - 그 전 IBMMQ 엔진에서도 만들기가 그대로 된다.
1747
+ _PV2_MQ_AUTH_KEYS = ("MQUSER", "MQPASSWORD")
1728
1748
 
1729
1749
  #: 열거 <-> 와이어 문자열(엔진 기술표의 ilsc 표기). IBMMQ 는 엔진 IBMMQ 판(590, 7.0.1.3633)부터 와이어에 있다.
1730
1750
  _CHANNEL_ENUMS = {
@@ -1784,6 +1804,9 @@ class ILChannelProperty(_AutoAccessor):
1784
1804
  rtt = _propv2.take(obj, "RTT", "INT")
1785
1805
  if rtt is not None:
1786
1806
  object.__setattr__(self, "rtt", rtt)
1807
+ reason = _propv2.take(obj, "REASON", "STR") # 다음 판: 엔진 594 CHLREASON-1(7.0.1.3637)
1808
+ if reason is not None:
1809
+ object.__setattr__(self, "reason", reason)
1787
1810
  if "DESTGROUP" in obj:
1788
1811
  arr = obj["DESTGROUP"]
1789
1812
  if not isinstance(arr, list) or any(not isinstance(e, dict) for e in arr):
@@ -1837,6 +1860,9 @@ class ILChannelProperty(_AutoAccessor):
1837
1860
  def _pv2_create_body(self) -> dict:
1838
1861
  """CREATE 본문(``NAME`` + 설정 칸 전부 + 목적지 그룹)을 만든다. **라이브러리 내부용이다.**"""
1839
1862
  body = dict({"NAME": self.name}, **self._pv2_channel_body(type(self)._PV2_KEYS))
1863
+ for k in type(self)._PV2_MQ_AUTH_KEYS:
1864
+ if body.get(k) == "":
1865
+ del body[k] # 인증 안 함 = 엔진 기본값 - 3638 전 엔진에 모르는 키를 보내지 않는다
1840
1866
  body["DESTGROUP"] = self._pv2_dest_body()
1841
1867
  return body
1842
1868
 
@@ -1867,6 +1893,8 @@ class ILChannelProperty(_AutoAccessor):
1867
1893
  "mqInstallPath": _spec_maxlen(255),
1868
1894
  "mqQueue": _spec_maxlen(48),
1869
1895
  "ilQueue": _spec_maxlen(47),
1896
+ "mqUser": _spec_maxlen(255),
1897
+ # mqPassword 는 길이를 검사하지 않는다 - 평문 상한(256)은 엔진이 판정하고, 봉인값 "{ARIA}<hex>" 은 그보다 길다
1870
1898
  }
1871
1899
 
1872
1900
  def __init__(
@@ -1901,6 +1929,7 @@ class ILChannelProperty(_AutoAccessor):
1901
1929
  self.certFileName = ""
1902
1930
  self.timeout = 30
1903
1931
  self.rtt = -1
1932
+ self.reason = ""
1904
1933
  self.traceEnabled = False
1905
1934
  self.balanceMode = ILChannelBalanceMode.ROUND_ROBIN
1906
1935
  self.mqChannel = "SYSTEM.DEF.SVRCONN"
@@ -1909,6 +1938,8 @@ class ILChannelProperty(_AutoAccessor):
1909
1938
  self.mqQueue = ""
1910
1939
  self.ilQueue = ""
1911
1940
  self.batchSize = 10
1941
+ self.mqUser = ""
1942
+ self.mqPassword = ""
1912
1943
  self.destGroupBufferLength = 0
1913
1944
  self.destGroup: List[DestItem] = []
1914
1945
 
@@ -2341,7 +2372,7 @@ class _PV2LoggerMixin:
2341
2372
  기준은 마지막으로 읽은(또는 보낸) 값이고, 읽은 적이 없으면 기본값이다.
2342
2373
 
2343
2374
  Raises:
2344
- PropV2Error: 레벨 칸에 0~7 밖의 코드가 있을 때.
2375
+ UnsupportedOperationException: 레벨 칸에 0~7 밖의 코드가 있을 때.
2345
2376
  """
2346
2377
  from . import _propv2
2347
2378
  cls = type(self)
@@ -2352,7 +2383,7 @@ class _PV2LoggerMixin:
2352
2383
  body = {}
2353
2384
  if now[0] != was[0]:
2354
2385
  if not (isinstance(now[0], int) and 0 <= now[0] < len(cls._PV2_LOG_LEVELS)):
2355
- raise _propv2.PropV2Error("LEVEL: unknown code %r" % (now[0],))
2386
+ raise UnsupportedOperationException("[%r] is an unacceptable value. (acceptable value range: LEVEL 0~7)" % (now[0],))
2356
2387
  body["LEVEL"] = cls._PV2_LOG_LEVELS[now[0]]
2357
2388
  if now[1] != was[1]:
2358
2389
  body["FILESIZE"] = int(now[1])
@@ -2476,12 +2507,12 @@ class ILAccessRuleProperty(_AutoAccessor):
2476
2507
  """CREATE 본문(``_TYPE`` 없음)을 만든다. **라이브러리 내부용이다.** ID · EFFECTIVE 는 서버가 정하므로 싣지 않는다.
2477
2508
 
2478
2509
  Raises:
2479
- PropV2Error: 규칙 종류 코드를 와이어 글자로 바꿀 수 없을 때(0 · 1 밖 - 판정이 아니라 인코딩 불가).
2510
+ UnsupportedOperationException: 규칙 종류 코드를 와이어 글자로 바꿀 수 없을 때(0 · 1 밖 - 판정이 아니라 인코딩 불가).
2480
2511
  """
2481
2512
  from . import _propv2
2482
2513
  back = {v: k for k, v in type(self)._ACL_TYPES.items()}
2483
2514
  if self.type not in back or isinstance(self.type, bool):
2484
- raise _propv2.PropV2Error("TYPE: unknown code %r (DENY(0) | ALLOW(1))" % (self.type,))
2515
+ raise UnsupportedOperationException("[%r] is an unacceptable value. (acceptable value range: TYPE DENY(0) | ALLOW(1))" % (self.type,))
2485
2516
  return {"TYPE": back[self.type], "CLIENTIP": str(self.ip or ""), "CLIENTNAME": str(self.clientName or ""),
2486
2517
  "CLIENTTYPE": str(self.clientType or "")}
2487
2518
 
@@ -3424,7 +3455,7 @@ class ILQmgrProperty(_PV2LoggerMixin, _AutoAccessor):
3424
3455
  if field == "autoStart":
3425
3456
  v = bool(v)
3426
3457
  if v not in back:
3427
- raise _propv2.PropV2Error("%s: unknown code %r" % (type(self)._PV2_KEYS[field][0], getattr(self, field)))
3458
+ raise UnsupportedOperationException("[%r] is an unacceptable value. (acceptable value range: %s %s)" % (getattr(self, field), type(self)._PV2_KEYS[field][0], " | ".join("%s(%s)" % (k, int(v)) for k, v in type(self)._QMGR_ENUMS[field].items())))
3428
3459
  return back[v]
3429
3460
 
3430
3461
  def _pv2_patch_body(self) -> dict:
@@ -4714,7 +4745,7 @@ class ILServiceProperty(_PV2LoggerMixin, _AutoAccessor):
4714
4745
  """ALTER 본문(세터로 바꾼 칸만, ``_TYPE`` 없음)을 만든다. **라이브러리 내부용이다.**
4715
4746
 
4716
4747
  Raises:
4717
- PropV2Error: 열거 칸에 모르는 정수 코드가 있을 때.
4748
+ UnsupportedOperationException: 열거 칸에 모르는 정수 코드가 있을 때.
4718
4749
  """
4719
4750
  from . import _propv2
4720
4751
  cls = type(self)
@@ -4725,7 +4756,7 @@ class ILServiceProperty(_PV2LoggerMixin, _AutoAccessor):
4725
4756
  if field in dirty:
4726
4757
  back = {code: name for name, code in cls._SERVICE_ENUMS[field].items()}
4727
4758
  if getattr(self, field) not in back:
4728
- raise _propv2.PropV2Error("%s: unknown code %r" % (key, getattr(self, field)))
4759
+ raise UnsupportedOperationException("[%r] is an unacceptable value. (acceptable value range: %s %s)" % (getattr(self, field), key, " | ".join("%s(%d)" % (n, c) for n, c in cls._SERVICE_ENUMS[field].items())))
4729
4760
  out[key] = back[getattr(self, field)]
4730
4761
  return {k: out[k] for _, (k, _) in cls._PV2_KEYS.items() if k in out} # 표 순서
4731
4762
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jetstream-api
3
- Version: 0.27.1
3
+ Version: 0.28.0
4
4
  Summary: Python client API for iLink M.O.M. (Message Oriented Middleware)
5
5
  Author: snowjeans
6
6
  License: Boost Software License - Version 1.0 - August 17th, 2003
@@ -60,6 +60,20 @@ lz4 배치 압축을 쓰려면 `pip install "jetstream-api[lz4]"`, zstd 배치
60
60
  ## 설치 방법
61
61
  pip install jetstream-api
62
62
 
63
+ ## 0.28.0 변경 - IBMMQ 채널 MQ 인증 · 채널 사유(REASON) · 입력값 오류 표시 (자바 v2.24.0 와 같음, 짝 엔진 7.0.1.3638 이상)
64
+
65
+ - 새 칸: IBMMQ 채널 MQ CONNAUTH ``mqUser`` · ``mqPassword`` (엔진 7.0.1.3638 이상). 둘은 한 쌍이다(한쪽만 있으면 엔진이 ``MIMQE_INVALID_PROPERTY``,
66
+ 걷으려면 둘 다 ``""``). ``mqPassword`` 는 비밀 칸이다 - 조회하면 ``"*****"`` (없으면 ``""``), ``"*****"`` 를 되보내면 그대로 유지, ``""`` 는 지우기,
67
+ ``"{ARIA}<hex>"`` 는 봉인값으로 받는다. 클라는 비밀번호 길이를 검사하지 않고 사람이 읽는 요약에 찍지 않는다. 빈 인증 칸은 CREATE 에 싣지 않는다.
68
+ - 새 칸: 채널 읽기 전용 ``reason`` (엔진 7.0.1.3637 이상, 최대 69자) - ERROR · STOPPED 가 된 사유(``"stopped by ..."`` · MQ cc/rc · ``"follower node"``).
69
+ RUNNING · STARTING 이면 빈칸이다. MQ 인증 실패는 ``MQCONNX failed cc=2 rc=2035 (auth: ...)`` 로 보인다.
70
+ - 채널 목록(``getChannelList``)은 ``REASON`` 을 7.0.1.3637 이상, 인증 칸을 7.0.1.3638 이상 엔진에만 묻는다(``ILC.CHANNEL_REASON_MIN_REVISION`` · ``ILC.IBMMQ_AUTH_MIN_REVISION``).
71
+ - IBMMQ 채널 흐름(엔진 7.0.1.3634 이상): START 가 실제 MQ 흐름을 띄운다(3633 · MQ SDK 없이 지은 엔진은 ``MIMQE_UNSUPPORTED``).
72
+ START 를 받아들인 뒤의 MQ 연결 실패는 채널 ERROR + 엔진 자동 재시도, STOP 은 1초 안에 STOPPED, MsgId · CorrelId 는 24바이트 <-> base64url 32자.
73
+ 클러스터 팔로워의 IBMMQ 채널은 START 해도 STANDBY 로 남는다(REASON ``"follower node"``).
74
+ - 고침: 보내기 전에 막는 열거 코드 오류(ACL ``type`` · 큐 관리자 ACLTYPE/STARTMODE · 서비스 TYPE/ACLTYPE · 로그 레벨 0~7 밖)가
75
+ ``MIMQC_FATAL_ERROR (MIMQE_INTERNAL_ERROR)`` 로 감싸여 보였다 - 이제 ``UnsupportedOperationException`` (``[v] is an unacceptable value. ...``) 그대로다.
76
+
63
77
  ## 0.27.1 변경 - 기동 · 정지 중 큐 관리자 조회 (자바 v2.23.1 와 같음, 짝 엔진 7.0.1.3633 이상)
64
78
 
65
79
  0.27.0 은 시험 판(test.pypi)만 내고 버렸다 - 회귀에서 아래 결함이 나왔다.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jetstream-api"
7
- version = "0.27.1"
7
+ version = "0.28.0"
8
8
  description = "Python client API for iLink M.O.M. (Message Oriented Middleware)"
9
9
  authors = [{name = "snowjeans"}]
10
10
  readme = "README.md"
File without changes