CP4NAを使い始める(MacOS+VSCode)


# はじめに
Cloud Pak for Network Automation (CP4NA)を使い始める時に、まずはローカルの環境のセットアップが必要となります。[ドキュメント][1]にも導入方法が記載されていますがだいぶサラッとしていますので、実際にVSCodeを使ってセットアップしてみた例をご紹介します。  

本手順は以下の環境で実施しています。
- クライアントPC: macOS 13.4
- エディタ: Visual Studio Code 1.80.1
- Python: 3.11.4
- lmctl: 3.5.0
- CP4NA: 2.4

[1]:https://github.com/IBM/lmctl/blob/main/docs/getting-started.md

# 本手順の対象・流れ
VSCode上でPythonの仮想環境を作成し、CP4NAのコマンドラインツールである`lmctl`をインストールします。lmctlを使用して、CP4NAの環境に接続するための設定を行います。

# 1. Python環境セットアップ
## 1.1. VSCodeワークスペースの作成
CP4NAのワークスペースのディレクトリを作成します。環境変数`CP4NA_HOME`を設定しておきます。
```zsh
 % export CP4NA_HOME=~/work/cp4na-dev
 % export LMCONFIG=${CP4NA_HOME}/.lmctl/lmctl-config.yaml
 % mkdir -p ${CP4NA_HOME}/.lmctl
```
後々のために、`.zshrc`にも設定を入れておきます。
```zsh
 % echo "export CP4NA_HOME=${CP4NA_HOME}" >> ~/.zshrc
 % echo 'export LMCONFIG=${CP4NA_HOME}/.lmctl/lmctl-config.yaml' >> ~/.zshrc
```

「フォルダーを開く」で上記で作成したディレクトリを開きます。その後、「名前を付けてワークスペースを保存」で、ワークスペースとして保存します。名前は任意ですが、ここでは`cp4na-dev`とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/ed90300c-7647-294a-6b31-af4ae704e486.png)

以降は、ワークスペースを開くことで環境を復元できます。
（私はいつも「最近使用した項目を開く」から選択しています。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/3b47bee4-a184-cc49-3cbf-1257050feed4.png)

## 1.2. Python仮想環境の作成
VSCodeのコマンドパレットを開き、「Python:環境の作成」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/99130634-d569-173a-8eeb-a47a2b8c5148.png)

「環境の種類の選択」→Venv
「Pythonインストール」→Python 3.11.4 64-bit　
を選択して、仮想環境を作成します。（Homebrewを使用していない場合は、3.11が入っていないかもしれません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/b6c14a95-cabd-a57d-b432-2e963f322c47.png)

:::note info
コマンドラインで仮想環境を作成することも可能です。
:::

## 1.3. lmctlのインストール
VSCodeのコマンドパレットを開き、「Python:インタープリターを選択」を選択します。
ワークスペースを選び、作成した仮想環境を選択します。（おすすめになっています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/803d4021-748a-f8e2-17bc-ecbd5053fdd9.png)

この状態で「ターミナルを開く」と、仮想環境のインタープリターが適用されたターミナルが起動します。プロンプトが`(.venv) %`となっていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/4d40f9a6-61da-bc92-cbaf-d90e44623c63.png)

最新のlmctlをインストールするには、以下のコマンドを実行します。
```python
(.venv) % pip install lmctl
```

インストールを確認するには、以下のコマンドを実行します。
```python
(.venv)  % lmctl --version
lmctl, version 3.5.0
(.venv)  % 
```

:::note warn
最新のlmctlがお使いのCP4NAのバージョンに互換性がない場合は古いバージョンのlmctlを導入してください。lmctlのバージョンが古いとCP4NAの環境を認識できないなど問題が生じる原因になりますので、なるべく新しいバージョンを使用することをお勧めします。
:::


## 1.4. Python仮想環境の自動有効化
ワークスペースを一旦閉じると、都度インタープリターの設定をし直す必要があります。
ターミナルで１行コマンドを打てばロードされます。
```zsh
% source ${CP4NA_HOME}/.venv/bin/activate
(.venv)  % 
```

それすら面倒な時に、自動的にインタープリターを設定するには、ワークスペースの設定に`python.defaultInterpreterPath`を追加します。
VSCodeのコマンドパレットを開き、「基本設定:ワークスペース設定を開く(JSON)」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/df611443-dd29-bc06-c4b3-ba9abc0d6525.png)

エディタで`cp4na-dev.code-workspace`が開くので、settingsに以下のように追記します。
```json
{
	"folders": [
		{
			"path": "../work/cp4na-dev"
		}
	],
	"settings": {
		"python.defaultInterpreterPath": "${workspaceFolder}/.venv"
	}
}
```
保存して閉じます。
この設定だけでは、ワークスペースを開くと同時にはインタープリターはロードされませんでした。
どうやらpythonファイルを開くなりプレビューをするなど触れる必要があるみたいです。
試しにワークスペースの好きな場所に空のpythonスクリプトファイルを作成します。

```zsh
% touch _.py
```
ワークスペースを閉じて再度開いた後に、.pyファイルを開くと右下のステータスバーで仮想環境が選択されていることが分かります。この状態で新しいターミナルを開くと、仮想環境が自動でアクティベートされます。（復元されたターミナルでは、いずれにせよコマンドを打つ必要あり。）

#もっといい方法をご存知の方がいれば教えていただけると嬉しいです。


# 2. CP4NA環境への接続
## 2.1. oc login
CP4NAがインストールされたOpenshiftクラスタにログインします。
以下でログイン済みであることを確認します。
```zsh
% oc version
Client Version: 4.10.25
Server Version: 4.10.22
Kubernetes Version: v1.23.5+3afdacb
```

## 2.2. CP4NAインストール情報
CP4NAのインストール情報を取得するため、CP4NAをインストールした名前空間を設定します。
```zsh
#インストールに使用したネームスペース
export NAMESPACE="cp4na-enablement"
```
以下はコピペでOK。
```zsh
export CP4NA_ISHTAR=https://$(oc get route -n ${NAMESPACE} cp4na-o-ishtar -o jsonpath='{.spec.host}')
echo ${CP4NA_ISHTAR}
export CP4NA_AUTH=$(oc get orchestration -n ${NAMESPACE} -o jsonpath='{.items[*].status.uiendpoints.orchestration}')/icp4d-api/v1/authorize
echo ${CP4NA_AUTH}
```
`CP4NA_ISHTAR`は`https://cp4na-o-ishtar-<NAMESPACE>.<OCP_CLUSTER_ENDPOINT>`
`CP4NA_AUTH`は`https://cpd-<NAMESPACE>.<OCP_CLUSTER_ENDPOINT>/icp4d-api/v1/authorize`
のような文字列になる。後続の`2.4`で使用します。

## 2.3. API keyの取得
lmctlでCP4NAにログインするために使用するAPI Keyを取得します。
CP4NAのUIにアクセスし、ログインします。  
ログインしたら、右上のユーザーアイコンをクリックし、「プロファイルと設定」をクリックします。
![スクリーンショット 2022-08-09 17.44.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/b1ea8c5a-9c90-e069-a407-327a0f93aefb.png)
右上の「API鍵」から「新規鍵の生成」をクリックします。
![スクリーンショット 2022-08-09 17.45.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/da415290-b908-56ae-1f07-444890cb6d67.png)
「生成」をクリックします。
![スクリーンショット 2022-08-09 17.46.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/a96656e3-8d80-d6ef-24a0-02867682fbc4.png)
「コピー」をクリックします。
![スクリーンショット 2022-08-09 17.46.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/ec7dd9b8-a1ba-1071-6ad8-60af27f9fc7f.png)



## 2.4. lmctl configの設定
CP4NAの環境についての情報を設定します。
`CP4NA_ENV_NAME`は複数のCP4NAを識別するための名前を設定します。
例えば、開発環境と本番環境でCP4NA環境が分かれている場合は、dev, prodなどとします。
`CP4NA_ENV_DESC`は環境の説明を記載します。
`CP4NA_USER`はCP4NAのAPI Keyを発行したユーザーを設定します。
`CP4NA_APIKEY`には`2.3`節で取得したAPI keyを設定します。

```zsh
export CP4NA_ENV_NAME="dev"
export CP4NA_ENV_DESC="CP4NA dev environment"
export CP4NA_USER="yukikod" #デフォルトはadmin
export CP4NA_APIKEY="xxxxxxxxxxxxxxxxxxxxxx"
```

以下のように、`lmctl-config.yaml`を作成します。
複数の環境を定義する場合は、environmentsの下に並記していきます。
```zsh
cat << EOF > ${LMCONFIG}
environments:
  ${CP4NA_ENV_NAME}:
    description: ${CP4NA_ENV_DESC}
    tnco:
      address: ${CP4NA_ISHTAR}
      secure: true
      auth_mode: zen
      auth_address: ${CP4NA_AUTH}
      username: ${CP4NA_USER}
      api_key: ${CP4NA_APIKEY}
EOF
```

## 2.5. 確認
設定ができたら、`lmctl`コマンドでCP4NAの環境が登録されていることを確認します。
`lm`列にCP4NAのAPIのURLが記載されていることを確認します。

```zsh
(.venv)  % lmctl env list
| name | description           | lm                                                        | arms   |
|------+-----------------------+-----------------------------------------------------------+--------|
| dev  | CP4NA dev environment | https://cp4na-o-ishtar-<NAMESPACE>.<OCP_CLUSTER_ENDPOINT> | N/A    |
(.venv)  % 
```

# まとめ
CP4NAのローカル環境のセットアップについて、VSCodeを使った実際の例をまとめました。
参考になれば幸いです。