Wazi: OpenShift上でのメインフレーム開発環境構築 - (7)Sandboxインスタンスへの接続

# はじめに
Sandbox(z/OS)が上がったので、それを利用するための各種クライアントからの接続を行ってみます。ここでは各クライアントからとりあえず接続するための基本構成のところまでを示します。
(VSCodeの細かい利用手順などは別記事で取り上げる予定です。)

## 関連記事
[Wazi: OpenShift上でのメインフレーム開発環境構築 - (1)事前準備](https://qiita.com/tomotagwork/items/4f254440959ff0a97e4b)
[Wazi: OpenShift上でのメインフレーム開発環境構築 - (2)ライセンス・サーバーの構成](https://qiita.com/tomotagwork/items/2017ef0fbf8777a3c95e)
[Wazi: OpenShift上でのメインフレーム開発環境構築 - (3)イメージ・ストレージ・サーバーの構成](https://qiita.com/tomotagwork/items/1577193ca59eb2ae1fa5)
[Wazi: OpenShift上でのメインフレーム開発環境構築 - (4)OpenShiftクラスターの構成](https://qiita.com/tomotagwork/items/d0b358db6b0bfd819ffe)
[Wazi: OpenShift上でのメインフレーム開発環境構築 - (5)Sandboxインスタンスの作成](https://qiita.com/tomotagwork/items/74193fb90e3a3acd9c9b)
[Wazi: OpenShift上でのメインフレーム開発環境構築 - (6)Sandboxインスタンスの確認](https://qiita.com/tomotagwork/items/c8370878c0fd549b0a44)
[Wazi: OpenShift上でのメインフレーム開発環境構築 - (7)Sandboxインスタンスへの接続](https://qiita.com/tomotagwork/items/cfeec0ccab50d72a48e2)
[Wazi: OpenShift上でのメインフレーム開発環境構築 - (8)Sandboxのカスタマイズ](https://qiita.com/tomotagwork/items/52f66ab9c78b9d8b3131)
[Wazi: OpenShift上でのメインフレーム開発環境構築 - (9)Wazi Developer for Workspacesの作成](https://qiita.com/tomotagwork/items/7de6f979dabe160175e3)

# 全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e09a5f78-178e-a6ed-8ac1-bb4d28a77073.png)

WaziのSandboxで提供されるz/OSイメージはADCDをベースにカスタマイズされているもので、一通りのコンポーネントが構成された状態で提供されています。TN3270サーバーやz/OSMFなども勝手に上がっている状態なので、基本的にはそれらに接続するようにクライアント側の構成を行えばよいです。

# 各クライアント毎の接続

## PCOM
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/721fd9f7-e0d5-f3dd-e710-4b1de6c7c6fd.png)

### TN3270クライアント接続(TSO)
Sandboxが起動すると、デフォルトではTN3270サーバーが稼働していてAT-TLSによるTLS通信が行えるようになっています。さらにTLS通信用のポート(2023)がServiceとして公開されていますので、この2023にマッピングされるポートに対してPCOMから接続構成を行っていくことになります。

※ただし、デフォルトで提供されているTN3270サーバー用の証明書は公開キーの長さが512bitで作成されています。これは最近のセキュリティ要件を満たしておらず(1024bit未満はNG)、例えばPCOM v14/Windows10の環境ではこの証明書によるTLS接続はできません。TLS接続を行いたい場合は、z/OS側で証明書を作成しなおす必要があります。
参考: [Wazi: OpenShift上でのメインフレーム開発環境構築 - (8)Sandboxのカスタマイズ - TN3270サーバー](https://qiita.com/tomotagwork/items/52f66ab9c78b9d8b3131#tn3270%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC)
ちなみに、デフォルトのTN3270サーバーの構成では、2023ポートがAT-TLS用のポートとして使用されますが、このポートは"ConnType Any"と指定されており、まずTLS通信を試してNGの場合non-TLSの通信が行われることになります。

```xxx:ADCD.Z24B.TCPPARMS(PORT2023)抜粋
...
 TelnetParms         ; ATTLS defined secure port                        
  TTLSPort 2023      ;                                                  
  ConnType Any       ; Client chooses secure or nonsecure connection.   
...
```

参考: [Transport Layer Security](https://www.ibm.com/docs/en/zos/2.4.0?topic=security-transport-layer)

>Valid CONNTYPE statement options are as follows:
...
ANY Indicates that the connection can be either secure or basic. Telnet first tries a standard TLS handshake. If the handshake times out, a negotiated TLS connection (see the CONNTYPE NEGTSECURE option description) is attempted: 
If the client is willing to enter into a secure connection, secure protocols are used for all subsequent communication.
If the client is not willing to enter into a secure connection, a basic connection is established.

#### TLS接続
これは、TN3270サーバーが使用する証明書の再作成を実施済みの前提での手順です。
参考: [Wazi: OpenShift上でのメインフレーム開発環境構築 - (8)Sandboxのカスタマイズ - TN3270サーバー](https://qiita.com/tomotagwork/items/52f66ab9c78b9d8b3131#tn3270%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC)

##### Windows上でのCA証明書登録
TN3270サーバーの証明書に署名しているCA証明書(ルート証明書)をエクスポートして入手します。
以下のTSOコマンドを実行します。(USS上での実行例)

```
TAGUCHI:/u/TAGUCHI: >tsocmd "RACDCERT CERTAUTH EXPORT(LABEL('ADCDCA')) FORMAT(CERTB64) DSN('IBMUSER.CACERT.EXPORT') "
RACDCERT CERTAUTH EXPORT(LABEL('ADCDCA')) FORMAT(CERTB64) DSN('IBMUSER.CACERT.EXPORT')
```

`IBMUSER.CACERT.EXPORT`に、Base64 Encodingで証明書がエクスポートされます。

```xxx:IBMUSER.CACERT.EXPORT
-----BEGIN CERTIFICATE-----
MIID8jCCAtqgAwIBAgIBADANBgkqhkiG9w0BAQsFADB4MQswCQYDVQQGEwJVUzEO
MAwGA1UECBMFVGV4YXMxFzAVBgNVBAcTDkRhbGxhcy1Db3BwZWxsMQwwCgYDVQQK
EwNJQk0xDTALBgNVBAsTBERUU0MxIzAhBgNVBAMTGkFEQ0QgQ2VydGlmaWNhdGUg
QXV0aG9yaXR5MCAXDTE5MTAwMzA2MDAwMFoYDzIwNTAwMTAyMDU1OTU5WjB4MQsw
...(中略)...
JXvDHDaD
-----END CERTIFICATE-----
```

これをWindows上でADCDCA.cerというファイル名で保存します。

Windowsのインターネットオプション - コンテンツ - 証明書 を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5cc393cf-e2a1-9922-1906-972da47f7200.png)


信頼されたルート証明期間 - インポートを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/79aa8f31-868e-39d9-3865-1024338bd8db.png)

次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2cee8163-97dd-9178-c69e-dd753faf31d7.png)

入手したCA証明書"ADCDCA"のファイルを選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/40edf8c5-21a7-1a95-9dd1-30ad1da6c7fe.png)

次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/af86b96f-f303-8453-9824-74e08a37622a.png)

完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/dba946e6-24f4-8482-6aa7-ec9c0747a07a.png)

はい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/52cf91b5-cfc9-fc8b-7d1c-9aab4ba0796c.png)

OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2b28cfbd-3981-41e1-5bff-309aa246608d.png)

##### PCOM構成
まず、PCOM全体の構成として以下の設定を行います。
Windowsのスタートメニュー - IBM Personal Communications - ユーザー設定を選択
設定マネージャーが開くので、拡張タブを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/25cc3447-a889-d68c-ac04-a8742f858014.png)

"ホスト証明書検証をパススルーする" のチェックをはずします。これにチェックを入れると証明書の検証をしないので、その場合上のCA証明書の登録は不要となります。
※検証をパススルーするとはいえ署名が信頼されたものかどうかの検証が行われないだけで、このチェックを入れたとしても証明書の公開キーの長さが短いままだと証明書そのものの信頼性が無いと判断され、TLS接続は行えませんのでご注意ください。

次に、各セッションの接続構成を行います。

**通信の構成 - リンク・パラメーター - ホスト定義**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/122d0aee-3cec-dca5-49ed-ec8cac425cf7.png)

Podの2023ポートがNodePortタイプのServiceで32103ポートで公開されていますので、Workerノードのアドレス + 32103ポートを指定します。ここでは、ローカルのPCのhostsファイルに、WorkerノードのIPアドレスとOCPW01.DAL-EBIS.IHOST.COMというホスト名のマッピングを定義しています。(ドメイン名をサーバー証明書のドメイン名と合わせるため)

**通信の構成 - リンク・パラメーター - セキュリティの設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cc297328-fbfc-1784-8fd5-7807685bd456.png)

"セキュリティーの使用"にチェックを入れます。これによりTLS通信が行われます。
"サーバー名と証明書名の一致を検査"にチェックを入れると、上のホスト定義で指定したホスト名と、TN3270サーバーから送られてきたサーバー証明書に含まれるドメイン名をチェックします。この検査を回避したい場合はチェックを外してください(一致しなくてもTLS通信が可能となります)。

接続できると以下のようにユーザーIDが求められるので、ユーザー名を指定してその後パスワード入力するとTSOに入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/76c40372-f2e1-3e4d-43dc-2a4a69b0ab4b.png)


#### non-TLS接続
TLSの接続の手順にあるCA証明書の登録はせず、また、セキュリティーの設定で"セキュリティーの使用"のチェックをはずせばOKです。z/OS側でサーバー証明書の再作成も不要です。
(宛先のIPアドレス/ホスト名 + ポート番号の指定のみ)

### non-SNA端末接続

基本的には、TN3270サーバーに対してTN3270(TCP/IP)経由で接続すればよいですが、z/OS上のTCP/IPスタックに問題が生じたり何らかの問題判別などを行う場合にz/OS上のTCP/IPスタックを経由せずに接続したいケースがあるかもしれません。そのような場合のためにnon-SNA端末接続を試しておきます。
※この通信は暗号化されませんのでご注意ください。

non-SNA端末接続するには、zpdtが稼働しているコンテナー上3270番でListenしているポートに接続する必要があります。
デフォルトではこのポートは公開されていないので、このポートを公開するためのServiceをOpenShiftクラスター上のSandboxと同じプロジェクトに作成します。
以下のYAMLファイルを作成します。

```yaml:wazi-tempsvc.yaml
apiVersion: v1
kind: Service
metadata:
  name: wazi-tempsvc
  namespace: wazi-test01
spec:
  type: NodePort
  selector:
    app.kubernetes.io/instance: wazi-sandbox01
    app.kubernetes.io/name: wazi-sandbox-system
  ports:
  - name: non-sna-terminal
    nodePort: 30270
    port: 3270
    protocol: TCP
    targetPort: 3270
```

この例では、コンテナ上の3270ポートをWorkerノードの30270ポートとして公開するよう設定しています。
上のYAMLを適用してServiceを作成します。

```
[root@Test05 ~/openshift/Wazi]# oc apply -f wazi-tempsvc.yaml
service/wazi-tempsvc created
[root@Test05 ~/openshift/Wazi]# oc get svc
NAME                                 TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                                                                                                               AGE
wazi-sandbox01-wazi-sandbox-system   NodePort   172.21.137.238   <none>        8443:30690/TCP,22:31175/TCP,2023:32103/TCP,7394:31125/TCP,7395:30146/TCP,7392:30837/TCP,4035:31510/TCP,4037:31771/TCP,7397:30884/TCP,9443:32443/TCP,10443:31917/TCP   3d19h
wazi-tempsvc                         NodePort   172.21.225.116   <none>        3270:30270/TCP
```

これでWorkerノード上の30270ポートでnon-SNA端末接続ができるようになりました。

#### マスター・コンソール
マスター・コンソールとして接続するには、Workerノードの30270ポートに対して、PCOM上で以下のような接続構成を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/62b4a19c-79d0-88c6-5ab3-51a4a0441484.png)
OCPW01というのはWorkerノードのアドレスを指しています。

接続すると、以下のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c918aeda-a97a-30e7-99aa-dbcb90652ff5.png)
PCOMは一旦このままの状態で置いておきます。

ocコマンドでSandboxのコンテナに接続し、以下のようにoprmsgコマンドを実行します。

```
[root@Test05 ~/openshift/Wazi]# oc get pod
NAME                                                       READY   STATUS      RESTARTS   AGE
sandbox-fix-init-copy-wazi-sandbox-volume-copy-job-8dbc7   0/1     Completed   0          3d21h
wazi-sandbox01-wazi-sandbox-system-6679544c49-9d8xp        1/1     Running     0          3d19h
[root@Test05 ~/openshift/Wazi]# oc exec wazi-sandbox01-wazi-sandbox-system-6679544c49-9d8xp -it -- bash
[root@wazi-sandbox01-wazi-sandbox-system-6679544c49-9d8xp ibmsys1]# whoami
root
[root@wazi-sandbox01-wazi-sandbox-system-6679544c49-9d8xp ibmsys1]# su - ibmsys1
[ibmsys1@wazi-sandbox01-wazi-sandbox-system-6679544c49-9d8xp ~]$ oprmsg 'V CN(*),ACTIVATE'
[ibmsys1@wazi-sandbox01-wazi-sandbox-system-6679544c49-9d8xp ~]$ oprmsg 'V 700,CONSOLE'
```

すると、PCOMがマスター・コンソールとして使用できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1bdcdc98-f769-ec45-9851-739b098e707b.png)

#### TSO
TSOに接続する場合は、Workerノードの30270ポートに対して、PCOM上で以下のような接続構成を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/86ca2e0b-6c95-fe50-c2f7-8d56b30b37e9.png)
OCPW01というのはWorkerノードのアドレスを指しています。

接続すると、以下のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2744511e-ccac-0f4c-7390-a3df7f02e08c.png)

「L TSO」でログイン画面になり、ユーザーID/パスワード認証すればTSOにログインできます。

操作が終わったらPCOM切断してService削除しておきます。

## z/OSMF

PC上のブラウザからz/OSMFの管理コンソールにアクセスしてみます。
以下のURLでアクセスできます。
`https://<workerNodeAddress>:<exposedZosmfPort>/zosmf/`
workerNodeAddress: ワーカーノードのアドレス
exposedZosmfPort: z/OSMF用のポート(10443)のnodePort

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/bc6a73dd-51e3-99b5-ca27-0350e5d3b293.png)

z/OS上にユーザーを作成して、IZUADMINグループにコネクトすれば管理者としてログインしz/OSMFを利用できるようになります。

```xxx:TSOコマンド例
CONNECT TAGUCHI GROUP(IZUADMIN)
```

z/OSMFにログイン！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f7aae1ab-1a88-6e42-6609-b4f0fb8a2c6b.png)

接続できました。

## VSCode
参考: [Installing Wazi Developer for VS Code](https://www.ibm.com/docs/en/wdfrhcw/1.2.0?topic=code-installing)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ee345f25-7258-fe43-e346-2272a4606388.png)


VSCodeからz/OSに接続する際は、内部的にZowe CLIというコンポーネントを使ってz/OSMFとの通信が行われます。そのため、事前にZowe CLI - z/OSMFとの接続構成を行っておく必要があります。さらに、VSCode上のExtensionとして、Zowe CLIを使うためのZowe Explorer Extension、z/OS上のソースを編集するためのエディター機能を提供する IBM Z Open Editor Extension、デバッグツールを利用するためのIBM Z Open Debug Extensionを追加することになります。

### VSCodeのインストール

以下のサイトからVSCode本体をダウンロードしてインストールします。
(V1.44以降が必要。今回はstableの最新版V1.52.1を使用)
[Visual Studio Code](https://code.visualstudio.com/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7f61608a-e789-9c20-d1e5-383a9073af29.png)

ダウンロードしたインストーラーを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7dfb3576-af08-a2f6-c68c-76119520d7e7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8a4ff7e7-b991-5f03-0d83-17ae15242af7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/05c228fb-5b65-d415-0fd9-4826f43b58ee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8e6fcb0e-8ab1-7671-5d86-ea380b1b7ac1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c15b1d2b-e61d-f2d4-5bfd-fbef5b922e09.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f0c1f412-dc59-01bb-40fa-d6276a333e24.png)


### IBM Wazi Developer for VS Codeのダウンロード

以下のmainframe-downloadsのサイトから、WaziにアクセスするためのExtensionなどがダウンロードできます。
https://ibm.github.io/mainframe-downloads/downloads.html

VSCodeを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cec17be5-3f7f-3f2a-d71c-678fce101bbc.png)

ライセンスを確認してagree
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9510d214-daa0-05eb-b2ab-8d25e8993f3d.png)

ダウンロードしたzipを展開するとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6d1addeb-c9d0-7555-4e11-fb0d7f9f2712.png)

### Zowe CLIのセットアップ
VSCodeからWazi Sandboxに接続するにはZowe CLIを使用するので、事前にZowe CLIのセットアップをしておく必要があります。
※ZoweというのはOSSを活用したz/OSの新しいフレームワークで、新しいアクセス方法やUIなどが提供されます(無償で利用できます)。Zowe CLIもZoweで提供される機能の一つで、その名の通りCLI(Command Line Interface)を提供しており、WindowsやLinuxからコマンドで各種z/OSの操作することができます。

#### Zowe CLIのインストール
参考: [Installing Zowe CLI from an online registry](https://docs.zowe.org/stable/user-guide/cli-installcli.html#installing-zowe-cli-from-a-local-package)

Zowe CLIはnode.jsとして実装されているので、前提としてnode.jsとパッケージ管理ツールとしてnpmが必要になります(これらもOSSです。これらのインストール手順はここでは省略)。
今回使用する環境は、Windows10上にnode.js、npmがそれぞれ以下のバージョンのものが入っている状態です。

```
c:\>node --version
v10.15.1

c:\>npm --version
6.14.11
```

Zowe CLIは先にダウンロードしたファイルの中にも提供されていますが、Webから最新版(V6.25.1)をインストールします。

```
c:\>npm install -g @zowe/cli@zowe-v1-lts
C:\Users\TomohiroTaguchi\AppData\Roaming\npm\zowe -> C:\Users\TomohiroTaguchi\AppData\Roaming\npm\node_modules\@zowe\cli\lib\main.js
C:\Users\TomohiroTaguchi\AppData\Roaming\npm\bright -> C:\Users\TomohiroTaguchi\AppData\Roaming\npm\node_modules\@zowe\cli\lib\main.js

> @zowe/cli@6.25.1 postinstall C:\Users\TomohiroTaguchi\AppData\Roaming\npm\node_modules\@zowe\cli
> node ./scripts/validatePlugins

Since you re-installed Zowe CLI, we are re-validating any plugins.

_____ Validation results for plugin '@zowe/secure-credential-store-for-zowe-cli' _____
This plugin was successfully validated. Enjoy the plugin.
+ @zowe/cli@6.25.1
added 9 packages from 1 contributor, removed 1 package and updated 11 packages in 29.681s


c:\>zowe plugins install @zowe/secure-credential-store-for-zowe-cli@zowe-v1-lts
Plug-ins within the Imperative CLI Framework can legitimately gain
control of the zowe CLI application during the execution of every command.
Install 3rd party plug-ins at your own risk.

Imperative's plugin installation program handles @zowe peer dependencies.
You can safely ignore NPM warnings about missing @zowe peer dependencies.

Registry = https://registry.npmjs.org/

_______________________________________________________________
"CLI Profiles that you have created will need to be recreated because their credentials are stored in the credential manager that has been uninstalled. Refer to the available options in the help text to create a new profile 'zowe profiles create zosmf-profile -h'."
"The Secure Credential Store has been successfully installed. The CLI will now use the Node Keytar module to encrypt your local credentials. CLI Profiles that you have created will need to be updated because their credentials are stored in plain text and not accessible from the credential manager. Refer to the available options in the help text to update profiles 'zowe scs update -h'."
npm WARN @zowe/secure-credential-store-for-zowe-cli@4.1.1 requires a peer of @zowe/cli@^6.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN @zowe/secure-credential-store-for-zowe-cli@4.1.1 requires a peer of @zowe/imperative@^4.0.0 but none is installed. You must install peer dependencies yourself.

Installed plugin name = '@zowe/secure-credential-store-for-zowe-cli'

_____ Validation results for plugin '@zowe/secure-credential-store-for-zowe-cli' _____
This plugin was successfully validated. Enjoy the plugin.

```

※以前旧バージョンのZowe CLIを入れていたので、新規にインストールする場合はメッセージの出方が違うと思います。

```
c:\>zowe --version
6.25.1
```

このようにzoweコマンドが打てればOK

#### Zowe CLI接続構成
※**2023年3月追記**: Zowe CLI V2のレベルでは接続構成の仕方が変わっています。Zowe CLI V2ベースでの接続構成については以下の記事をご参照ください。
参考: [VS Code - z/OS接続構成 (Zowe CLI V2編)](https://qiita.com/tomotagwork/items/e48be1114a5fca77d976)


Zowe CLIは内部的にz/OSMF提供のAPIを使用してz/OSにアクセスします。そのためz/OSMFとの接続構成を事前にProfileとして作成しておきます。
参考: [Using Zowe CLI - Using profiles](https://docs.zowe.org/stable/user-guide/cli-usingcli.html#using-profiles)

```
c:\>zowe profiles create zosmf-profile prof_Wazi01 --host S0W1.DAL-EBIS.IHOST.COM --port 31917 --user TAGUCHI --password xxx --reject-unauthorized false --encoding 1399
Profile created successfully! Path:
C:\Users\TomohiroTaguchi\.zowe\profiles\zosmf\prof_Wazi01.yaml

host:               OCPW01
port:               31917
user:               managed by @zowe/secure-credential-store-for-zowe-cli
password:           managed by @zowe/secure-credential-store-for-zowe-cli
rejectUnauthorized: false
encoding:           1399

Review the created profile and edit if necessary using the profile update command.

c:\>zowe profiles list zosmf-profiles
prof_EPLEX1 (default)
prof_ETP1
prof_Wazi01
```

prof_Wazi01というプロファイルが追加されました。
接続確認してみます。

```
c:\>zowe zosmf check status --zosmf-profile prof_Wazi01
The user TAGUCHI successfully connected to z/OSMF on 'S0W1.DAL-EBIS.IHOST.COM'.
zosmf_port:         10443
zosmf_saf_realm:    SAFRealm
zos_version:        04.27.00
zosmf_full_version: 27.0
api_version:        1

z/OSMF Plug-ins that are installed on 'S0W1.DAL-EBIS.IHOST.COM':
-
  pluginVersion:     HSMA240;PH19887P;2020-02-14T03:45:28
  pluginDefaultName: z/OS Operator Consoles
  pluginStatus:      ACTIVE
-
  pluginVersion:     HSMA240;DRIVER3;2019-03-11T16:18:29
  pluginDefaultName: Variables
  pluginStatus:      ACTIVE
-
  pluginVersion:     HSMA244;PH23276P;2020-03-18T00:53:31
  pluginDefaultName: Software Deployment
  pluginStatus:      ACTIVE
-
  pluginVersion:     HSMA245;PH16301P;2019-11-11T05:28:40
  pluginDefaultName: IncidentLog
  pluginStatus:      ACTIVE
-
  pluginVersion:     HSMA247;PH21919P;2020-03-12T09:53:05
  pluginDefaultName: Workflow
  pluginStatus:      ACTIVE
-
  pluginVersion:     HQX77C0;PH09964;2019-07-08T13:09:00
  pluginDefaultName: IBM SDSF
-
  pluginVersion:     HSMA24A;PH14146;2020-03-19T06:31:53
  pluginDefaultName: Network Configuration Assistant
  pluginStatus:      ACTIVE
-
  pluginVersion:     HSMA240;PH15554P;2019-12-02T07:41:17
  pluginDefaultName: Sysplex Management
  pluginStatus:      ACTIVE
-
  pluginVersion:     HSMA241;PH21269P;2020-02-20T07:00:29
  pluginDefaultName: ISPF
  pluginStatus:      ACTIVE
-
  pluginVersion:     HSMA240;PH16148P;2019-10-11T14:25:53
  pluginDefaultName: Import Manager
  pluginStatus:      ACTIVE
-
  pluginVersion:     HSMA242;PH16300P;2019-11-21T02:29:09
  pluginDefaultName: ResourceMonitoring
  pluginStatus:      ACTIVE
-
  pluginVersion:     HSMA243;PH20173P;2020-01-20T09:23:26
  pluginDefaultName: WorkloadManagement
  pluginStatus:      ACTIVE
-
  pluginVersion:     HSMA246;PH16150P;2019-11-21T03:18:24
  pluginDefaultName: Capacity Provisioning
  pluginStatus:      ACTIVE
-
  pluginVersion:     HSMA240;PH16513P;2019-12-09T20:51:50
  pluginDefaultName: Cloud Portal
-
  pluginVersion:     HSMA240;PH17871P;2019-12-14T09:15:44
  pluginDefaultName: Security Configuration Assistant
  pluginStatus:      ACTIVE
-
  pluginVersion:     HSMA240;PH16513P;2019-12-09T20:51:50
  pluginDefaultName: Cloud Provisioning
  pluginStatus:      ACTIVE
```

OKですね。

具体的なZowe CLIコマンドを試してみます。上のプロファイルを使用して、zos-filesというコマンドで IBMUSER以下のデータセットをリストしてみます。

```
c:\>zowe zos-files ls ds "IBMUSER.*" --zosmf-profile prof_Wazi01
IBMUSER.ADCDCERT.EXPORT
IBMUSER.CACERT.EXPORT
IBMUSER.EQAIVP.LOADPDSE
IBMUSER.HCD.MSGLOG
IBMUSER.HCD.TERM
IBMUSER.HCD.TRACE
IBMUSER.JCL
IBMUSER.S0W1.ISPF.ISPPROF
IBMUSER.S0W1.SPFLOG1.LIST
```

うまく動いてます。


### Zowe Explorer Extensionのインストール
VSCodeからWazi Sandboxにアクセスする際には、IBM Z Open EditorというVSCode Extensionを使いますが、この前提としてZowe CLIを使うためのZowe ExplorerというExtensionが必要になりますので、このExtensionをVSCode上にインストールします。
参考: [Installing Zowe Explorer](https://docs.zowe.org/stable/user-guide/ze-install.html#software-requirements)

VSCode Extensionのインストールは、vsixファイルからインストールする方法と、Webからインストールする方法があります。先にダウンロードしたzipを展開したファイルの中に"Zowe.vscode-extension-for-zowe-1.10.1.vsix"というファイルがあるのでこれを元にインストールしてもよいですが、Web上には最新のもの(V1.11.1)があったのでそちらからインストールすることにします。

VSCodeを開いて、左側のメニューから"拡張機能"のアイコンをクリックして、Zoweで検索するとZowe Explorerというのが出てくるので"インストール"をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/10e0b9a0-e2f0-31cb-28e1-26b7460d22ef.png)

### Zowe Explorer Extensionの設定(接続プロファイル追加)

左側にZoweのメニューが追加されるので開きます。DATA SETSの右の「+」アイコンをクリックして、上で作成したWazi上のz/OSMFへの接続用プロファイル"prof_Wazi01"を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2493d7c8-4410-c50d-ea6e-a9c52af23afc.png)

追加されたprof_Wazi01の右の虫眼鏡マークをクリックして、例えば「ADCD.*」を検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7c62ea9b-2716-ed65-d307-9916499ecffe.png)

以下のようにADCDデータセット以下が表示されて、PDSのメンバーをエディターで開いたりすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5d7f7004-ed1a-53bc-e999-92dbeecc7670.png)


### IBM Z Open Editor Extensionのインストール
これもWebからインストールできるので、VSCodeの拡張機能のメニューからインストールします。(V1.1.3)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e5fc01fe-f844-497d-2c80-50855a2c7ed6.png)

このExtensionを入れると、JCLやCOBOLなどの構文解析が行われて、色分け表示やコードアシスト機能が使えるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4851f409-59cf-562d-dcb9-0777d7333b88.png)

### IBM Z Open Debug Extensionのインストール
このExtensionはVSCodeのMarketplaceに無いので、先にダウンロードしたファイルからvsixを指定してインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/755165b1-e77f-1963-d3df-8f0063643cd2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/234076a5-0eeb-809f-ba12-b6690e02e8d8.png)

以下の2つをインストールします。
    zopendebug-1.1.0.vsix
    zopendebug-profileui-1.1.0.vsix

これでデバッグ機能が利用できるようになります。

## Eclipse (Wazi Developer for Eclipse)
参考:[Installing the Wazi Developer for Eclipse client](https://www.ibm.com/docs/en/wdfrhcw/1.2.0?topic=eclipse-installing-client)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/166b39fb-32db-47a8-302c-c3556fc26bd9.png)

Eclipseベースのクライアントからz/OSに接続する場合、z/OS側ではRSE(Remote System Explorer)というコンポーネントが稼働している必要があり、EclipseからはRSEに対して接続を行うことになります。
この時の挙動がちょっと複雑なので補足します。Eclipseクライアントは、まずRSED(Remote System Explroer Daemon)がListenしているポート(デフォルト:4035)に対して接続要求を行います。RSEDは接続要求を受けると、子プロセスを起動して実際の通信に使用するポートを動的にアサインしてListenし、その動的に割り当てたポート番号をクライアントに通知します。Eclipseクライアントは通知を受けたポート番号に対して改めてTCPコネクションを確立して、その後はそのコネクションを使ってやり取りが行われます。つまり、FTPのPassive Modeのような動きをします。
参考: [Defining the PORTRANGE available for RSE server](https://www.ibm.com/docs/en/wdfrhcw/1.2.0?topic=file-defining-portrange-available-rse-server)
参考: [Connection flow](https://www.ibm.com/docs/en/wdfrhcw/1.2.0?topic=explorer-connection-flow#connection_flow_z)
今回はNodePortタイプのServiceを利用してポートを公開しているので、この動的に割り当てられるポートと同じ番号をServiceとして事前に公開しておく必要があります(図の例では32300番ポート)。z/OS側の設定例は、後続記事の以下の箇所をご参照ください。
参考: [Wazi: OpenShift上でのメインフレーム開発環境構築 - (8)Sandboxのカスタマイズ - RSE(Remote System Explorer)](https://qiita.com/tomotagwork/items/52f66ab9c78b9d8b3131#rseremote-system-explorer)

以降は、EclipseクライアントとしてWazi Developer for Eclipseを使用し、かつRSEは上のリンク先の設定変更をしている想定での接続手順を示します。

### Wazi Developer for Eclipseのダウンロードとインストール
以下のmainframe-downloadsのサイトから、Wazi用のEclipseクライアントをダウンロードします。
https://ibm.github.io/mainframe-downloads/downloads.html

Eclipseを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ba99262e-4b5d-6ff1-fb32-72689eeab3ff.png)

Windows(64-bit)を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2ff2f59d-6efd-b2b6-2246-65731fd4c1b7.png)

ライセンスを確認してagree
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7c38022c-60ac-5bc4-ce69-a28094145241.png)

ダウンロードしたzipを適当な場所に解凍すればOKです(ここではc:\x\WD4E\に展開)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b12d8f6a-8cae-a32b-e07e-eda804b8099e.png)

インストーラーなどの実行は不要で、展開されたフォルダからWD4E.exeを実行すればEclipseが起動します。
適当なワークスペースのフォルダを指定して起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/109b6905-768d-b1b6-008c-023741f604dc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6605b608-0a79-86bd-3daf-a8183038feef.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5a5b61e3-84de-5a66-fe97-9fee5899cd97.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8284aafb-01ea-cee2-98aa-9588fa6c9056.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4450610f-d540-f421-6ac9-e263c5d22b97.png)

### ライセンスの適用
Waziを購入すると、Wazi Developer for Eclipse用のライセンスをアクティベートするためのzipファイル(ActivationKit)も入手できるので、それを適用します。

ヘルプから新規ソフトウェアのインストールを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/fed6c6bd-fa06-930b-446e-55842a25da1f.png)

追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3421abf5-f59c-81d8-680e-ee22e73d7936.png)

アーカイブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1a80990b-e3db-8f50-8935-19dab6f84ee2.png)

入手したActivationKitのファイル(Wazi_Eclipse_ActKit-1.1.0.zip)を選択して追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/03629b58-178e-7073-8ec0-321b9ef49afb.png)

WD4E Lumkitにチェックして次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e73491c6-efb7-1d0a-3b55-c5c20f1e59bf.png)

次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/57ca8763-71ac-603d-33ad-384e1ee24f32.png)

ライセンスに同意して終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0f6f0d3d-afc5-f246-3e31-b5872d2d73fa.png)

インストールを続行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5bdf8049-0c48-6a85-6776-44206bd6d574.png)

すぐに再始動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6debb681-9065-469e-b018-879fe00590f6.png)

### 接続構成

リモート・システム・ビューで 新規接続 - z/OS... を右クリックして 新規接続...を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f8027a1e-d064-320d-a0bd-561744997dc2.png)

ホスト名と接続名を指定して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f02b282c-807e-9d93-c832-2b7f36be4993.png)
ホスト名はOpenShiftクラスターのWorkerノードを指します(TN3270接続の所で示していますが、今回の環境ではこの名前でhostsにIPアドレスとのマッピングを登録しています)。
接続名は任意の分かりやすい名前を指定すればよいです。

ポート番号を指定して終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9e45c405-5dd7-7f7d-1eba-ac3546defc0c.png)
ポート番号は、4035ポートにマッピングされるServiceとして公開されているポート番号を指定します。

接続定義が追加されるので、右クリックして 接続 を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4750d596-a30b-c5b1-df56-f941d7b5b2a8.png)

ユーザーID、パスワードを指定してOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/fbe8dc8b-fd3e-42b0-d8cb-241d3d96e78c.png)

OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0452587f-f63a-30b7-c513-9c1e82f20b0f.png)

接続が完了すると、z/OS上のデータセットを表示したりメンバーを編集したりすることができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3607b77a-7588-2540-54bc-5087d941bc98.png)