# PhotonCloud VMクラスター検証計画

## 背景と目的

PhotonCloudシステム全体（12の主要コンポーネント）について、VM上でクラスターを構築し、以下を検証する：

1. **クラスターの正常動作**: 3ノードクラスターが正常に形成され、Raftクラスターが機能するか
2. **各コンポーネントの動作**: 全12コンポーネントが正常に起動し、APIが応答するか
3. **統合動作**: コンポーネント間の連携が正常に機能するか
4. **エンドツーエンドテスト**: 実際のユースケースが動作するか

## 現状の把握

### 実装済みコンポーネント（12個）

1. **ChainFire** - クラスターKVS（ポート: 2379/2380/2381）
2. **FlareDB** - DBaaS KVS（ポート: 2479/2480）
3. **IAM** - 認証・認可（ポート: 3000）
4. **PlasmaVMC** - VM基盤（ポート: 4000）
5. **PrismNET** - オーバーレイネットワーク（ポート: 5000）
6. **FlashDNS** - DNS（ポート: 6000）
7. **FiberLB** - ロードバランサー（ポート: 7000）
8. **LightningStor** - オブジェクトストレージ（ポート: 8000）
9. **k8shost** - K8sホスティング（ポート: 6443）
10. **NightLight** - メトリクス/オブザーバビリティ（ポート: 9101）
11. **CreditService** - クレジット/クオータ管理（ポート: 3010）
12. **Deployer** - ベアメタルプロビジョニング

### 過去のタスク状況

- **T036** (完了): VMクラスター展開の検証（部分的成功）
  - VDEネットワーキング検証済み
  - カスタムnetboot with SSH key検証済み
  - ディスク自動化検証済み
  - サービスデプロイはT038完了後に実施
  - **注意**: `validate-cluster.sh`のIAMポートは8080（古い設定）→ 実際は3000を使用

- **T039** (進行中): 本番デプロイメント
  - S1: ハードウェア準備（完了: 2025-12-12）
  - S2: ブートストラップインフラ（完了: 2025-12-12）
  - S3: NixOSプロビジョニング（進行中: 2025-12-13 07:34時点で最終フェーズ）
    - 全3ノードにNixOS 26.05インストール済み
    - 10サービス + systemdユニット生成中（ETA 5-10分）
  - S4-S6: サービスデプロイ、クラスター形成、統合テスト（未実施）

- **T040** (完了): HA検証
  - Raftクラスターの耐障害性検証済み
  - ギャップドキュメント作成済み

### 利用可能なリソース

- **VMインフラ**: `baremetal/vm-cluster/` に3ノードVM環境
  - node01: 192.168.100.11 (SSH: 2201)
  - node02: 192.168.100.12 (SSH: 2202)
  - node03: 192.168.100.13 (SSH: 2203)
  - VDEネットワーク: L2ブロードキャストドメイン

- **設定ファイル**: `docs/por/T036-vm-cluster-deployment/`
  - node01/02/03のconfiguration.nix, disko.nix, cluster-config.json

- **検証スクリプト**: `baremetal/vm-cluster/validate-cluster.sh`
  - **注意**: このスクリプトはT036用で、IAMポートが8080（古い設定）になっている
  - 実際の本番環境ではIAMは3000を使用
  - 使用前にポート番号を確認すること

- **統合テスト計画**: `docs/por/T039-production-deployment/S6-integration-test-plan.md`
  - T039.S6用の詳細なテスト計画
  - 正しいポート番号（IAM: 3000）を使用
  - 11サービス × 3ノードのヘルスチェック手順を含む

## 検証計画の全体構成

### フェーズ1: T039タスクの実行（S3-S6）

**目標**: T039の残りのステップ（S3-S6）を完了させる

#### T039.S3: NixOSプロビジョニング（実行中）

**現在の状況**:
- 全3ノードにNixOS 26.05インストール済み
- 10サービス + systemdユニット生成中（進行中）

**実行手順**:
1. **S3完了確認**
   ```bash
   cd /home/centra/cloud
   for node in 192.168.100.11 192.168.100.12 192.168.100.13; do
     echo "=== Checking $node ==="
     ssh root@$node 'nixos-version && systemctl list-units --type=service --state=running | grep -E "chainfire|flaredb|iam|plasmavmc|prismnet|flashdns|fiberlb|lightningstor|k8shost|nightlight|creditservice"'
   done
   ```

2. **NixOSプロビジョニングが未完了の場合**
   - T036の設定ファイルを使用してnixos-anywhereでプロビジョニング
   - 設定ファイル: `docs/por/T036-vm-cluster-deployment/node01/`, `node02/`, `node03/`
   - コマンド例:
     ```bash
     nixos-anywhere --flake .#node01 root@192.168.100.11
     nixos-anywhere --flake .#node02 root@192.168.100.12
     nixos-anywhere --flake .#node03 root@192.168.100.13
     ```

#### T039.S4: サービスデプロイメント

**目標**: 全12サービスが全3ノードで起動していることを確認

**実行手順**:
1. **サービス起動確認**
   ```bash
   cd /home/centra/cloud
   for node in 192.168.100.11 192.168.100.12 192.168.100.13; do
     echo "=== Services on $node ==="
     ssh root@$node 'systemctl list-units --type=service --state=running | grep -E "chainfire|flaredb|iam|plasmavmc|prismnet|flashdns|fiberlb|lightningstor|k8shost|nightlight|creditservice"'
   done
   ```

2. **サービスが起動していない場合**
   - ログ確認: `ssh root@$node 'journalctl -u <service-name> --no-pager -n 50'`
   - サービス有効化: `ssh root@$node 'systemctl enable --now <service-name>'`
   - 設定ファイル確認: NixOSモジュールの設定を確認

#### T039.S5: クラスター形成

**目標**: ChainFireとFlareDBのRaftクラスターが3ノードで形成される

**実行手順**:
1. **ChainFireクラスター確認**
   ```bash
   for node in 192.168.100.11 192.168.100.12 192.168.100.13; do
     echo "=== ChainFire Cluster on $node ==="
     grpcurl -plaintext $node:2379 chainfire.ClusterService/GetStatus || echo "ChainFire not ready"
   done
   ```

2. **FlareDBクラスター確認**
   ```bash
   for node in 192.168.100.11 192.168.100.12 192.168.100.13; do
     echo "=== FlareDB Cluster on $node ==="
     grpcurl -plaintext $node:2479 flaredb.AdminService/GetClusterStatus || echo "FlareDB not ready"
   done
   ```

3. **クラスターが形成されていない場合**
   - クラスター設定ファイル確認: `/etc/nixos/secrets/cluster-config.json`
   - ネットワーク接続確認: `ping`でノード間通信を確認
   - TLS証明書確認: `/etc/nixos/secrets/`の証明書ファイルを確認
   - ログ確認: `journalctl -u chainfire -u flaredb --no-pager`

#### T039.S6: 統合テスト

**目標**: T039.S6統合テスト計画に基づいて全テストを実行

**実行手順**:
- 詳細なテスト手順は `docs/por/T039-production-deployment/S6-integration-test-plan.md` を参照
- 8つのテストカテゴリを順次実行
- 結果を記録: `docs/por/T039-production-deployment/S6-results.md`

### フェーズ2: 基本動作検証

**目標**: 各コンポーネントが基本的な機能を提供できるか検証

**検証項目**:

1. **サービスヘルスチェック**
   - 全12サービスが全3ノードで応答するか
   - gRPCリフレクションが動作するか
   - ヘルスチェックエンドポイントが応答するか

2. **クラスター状態確認**
   - ChainFire: 3メンバー、リーダー選出、全ノード健全
   - FlareDB: 3メンバー、クォーラム形成、レプリケーション動作

3. **基本CRUD操作**
   - ChainFire: KV操作（put/get/delete）
   - FlareDB: KV操作とレプリケーション確認
   - データが全ノードにレプリケートされるか

### フェーズ3: コンポーネント間統合検証

**目標**: コンポーネント間の連携が正常に動作するか検証

**検証シナリオ**:

1. **IAM認証フロー**
   - 組織作成 → ユーザー作成 → 認証 → トークン発行 → トークン検証
   - 異なるノードからの認証要求が動作するか

2. **FlareDBストレージ統合**
   - データ書き込み → 異なるノードからの読み取り（レプリケーション確認）
   - トランザクション操作の動作確認

3. **LightningStor S3操作**
   - バケット作成 → オブジェクトアップロード → 異なるノードからのダウンロード
   - S3互換APIの動作確認

4. **FlashDNS名前解決**
   - DNSレコード作成 → 異なるノードからの名前解決
   - 複数ゾーンの動作確認

5. **PrismNETオーバーレイネットワーク**
   - VPC作成 → サブネット作成 → ポート作成
   - テナント分離の動作確認

6. **FiberLBロードバランシング**
   - ロードバランサー作成 → プール作成 → バックエンド追加
   - トラフィック分散の動作確認（テストバックエンドが必要）

7. **NightLightメトリクス収集**
   - Prometheusエンドポイントの動作確認
   - メトリクスクエリの動作確認
   - 全ターゲットがup状態か

8. **CreditServiceクオータ管理**
   - ウォレット作成 → 残高確認 → クオータチェック
   - Admission Controlの動作確認

9. **PlasmaVMC + PrismNET統合**
   - VM作成 → ネットワークアタッチ → VM起動
   - テナントスコープの動作確認

10. **k8shost統合**
    - Pod作成 → CNI動作確認 → サービス作成
    - FiberLBとの連携確認

### フェーズ4: エンドツーエンドシナリオ検証

**目標**: 実際のユースケースが動作するか検証

**シナリオ1: テナントオンボーディング**
1. IAMで組織・プロジェクト・ユーザー作成
2. PrismNETでVPC・サブネット作成
3. PlasmaVMCでVM作成・起動
4. FlashDNSでDNSレコード作成
5. FiberLBでロードバランサー作成
6. 全リソースが正常に動作するか確認

**シナリオ2: マルチテナント分離**
1. テナントAとテナントBを作成
2. 各テナントでリソース作成
3. テナントAがテナントBのリソースにアクセスできないことを確認
4. IAMの認可が正しく機能するか確認

**シナリオ3: データ永続化**
1. FlareDBにデータ書き込み
2. ChainFireにメタデータ書き込み
3. ノード再起動
4. データが永続化されているか確認

### フェーズ5: 耐障害性検証（T040の拡張）

**目標**: ノード障害時の動作を検証

**検証項目**:

1. **単一ノード障害**
   - node03を停止
   - ChainFire/FlareDBクラスターがクォーラムを維持するか（2/3）
   - データの読み書きが継続できるか
   - node03再起動後の自動復帰

2. **リーダー障害**
   - ChainFireリーダーを停止
   - 新しいリーダーが選出されるか
   - サービスが継続できるか

3. **ネットワーク分断**
   - ノード間の通信を一時的に遮断
   - クラスターが適切に動作するか
   - 通信回復後の自動復帰

## 実行手順

### 前提条件の確認

```bash
# 1. VM起動確認
ps aux | grep qemu | grep -E "node01|node02|node03"

# 2. VDEネットワーク確認
ps aux | grep vde_switch

# 3. SSH接続確認
for node in 192.168.100.11 192.168.100.12 192.168.100.13; do
  ssh root@$node 'hostname && nixos-version' || echo "Cannot connect to $node"
done
```

### フェーズ1: T039タスクの実行

フェーズ1の詳細な手順は上記の「フェーズ1: T039タスクの実行（S3-S6）」セクションを参照。

### フェーズ2実行

```bash
# サービスヘルスチェック
# T039.S6統合テスト計画の手順を使用（正しいポート番号）
cd /home/centra/cloud

# 各サービスのgRPCリフレクション確認
NODES=(192.168.100.11 192.168.100.12 192.168.100.13)
declare -A SERVICES=(
  ["chainfire"]=2379
  ["flaredb"]=2479
  ["iam"]=3000
  ["plasmavmc"]=4000
  ["lightningstor"]=8000
  ["flashdns"]=6000
  ["fiberlb"]=7000
  ["prismnet"]=5000
  ["k8shost"]=6443
  ["nightlight"]=9101
  ["creditservice"]=3010
)

for node in "${NODES[@]}"; do
  echo "=== Node: $node ==="
  for svc in "${!SERVICES[@]}"; do
    echo -n "  $svc:${SERVICES[$svc]} ... "
    if grpcurl -plaintext $node:${SERVICES[$svc]} list >/dev/null 2>&1; then
      echo "OK"
    else
      echo "FAIL"
    fi
  done
  echo ""
done

# 詳細なテスト手順は以下を参照:
# docs/por/T039-production-deployment/S6-integration-test-plan.md
```

### フェーズ3実行

各シナリオを順次実行。詳細な手順とコマンドは以下を参照:
- **統合テスト計画**: `docs/por/T039-production-deployment/S6-integration-test-plan.md`
  - 8つのテストカテゴリ（IAM認証、FlareDBストレージ、S3操作、DNS、PrismNET、FiberLB、NightLight、CreditService）
  - 各テストの実行コマンドと期待結果が記載されている

### フェーズ4実行

エンドツーエンドシナリオを実行。必要に応じてテストスクリプトを作成。

### フェーズ5実行

T040のrunbookを参照し、耐障害性テストを実行。

## 成功基準

### 必須項目（P0）

- [ ] 全12サービスが全3ノードで起動・応答
- [ ] ChainFireクラスター: 3メンバー、リーダー選出、健全
- [ ] FlareDBクラスター: 3メンバー、クォーラム形成、レプリケーション動作
- [ ] IAM認証フローが動作
- [ ] 基本CRUD操作が全ノードで動作
- [ ] データレプリケーションが動作

### 推奨項目（P1）

- [ ] 全コンポーネント間統合が動作
- [ ] エンドツーエンドシナリオが動作
- [ ] 単一ノード障害時のクォーラム維持
- [ ] メトリクス収集が動作

### 理想項目（P2）

- [ ] マルチテナント分離が正しく動作
- [ ] ロードバランシングが動作
- [ ] ネットワーク分断時の動作

## 問題発生時の対応

1. **サービス起動失敗**
   - `journalctl -u <service> --no-pager` でログ確認
   - 設定ファイルの確認
   - 依存サービスの確認

2. **クラスター形成失敗**
   - ネットワーク接続確認
   - TLS証明書の確認
   - クラスター設定ファイルの確認

3. **統合テスト失敗**
   - 各コンポーネントの個別動作確認
   - コンポーネント間の通信確認
   - ログの詳細確認

4. **データ不整合**
   - Raftログの確認
   - レプリケーション状態の確認
   - 必要に応じてクラスター再形成

## ドキュメント化

検証結果は以下に記録：

1. **検証レポート**: `docs/por/VM_CLUSTER_VALIDATION_RESULTS.md`
   - 各フェーズの実行結果
   - 成功/失敗の詳細
   - 発見された問題と対応

2. **問題追跡**: 必要に応じて新しいPORタスクを作成

3. **改善提案**: 検証で発見された改善点を記録

## タイムライン見積もり

- **フェーズ1**: 2-4時間（T039継続）
- **フェーズ2**: 1-2時間
- **フェーズ3**: 4-6時間
- **フェーズ4**: 2-3時間
- **フェーズ5**: 2-3時間

**合計**: 11-18時間

## 実行順序

### 即座に実行すべきこと

1. **T039.S3の完了確認**（最優先）
   - 各ノードでNixOSプロビジョニングが完了しているか確認
   - サービスが起動しているか確認
   - 未完了の場合はnixos-anywhereでプロビジョニングを完了

2. **T039.S4: サービスデプロイメント確認**
   - 全12サービスが全3ノードで起動していることを確認
   - 起動していないサービスがあればログを確認して修正

3. **T039.S5: クラスター形成確認**
   - ChainFireとFlareDBのRaftクラスターが3ノードで形成されていることを確認
   - クラスターが形成されていない場合は設定とログを確認

4. **T039.S6: 統合テスト実行**
   - `docs/por/T039-production-deployment/S6-integration-test-plan.md`に基づいてテストを実行
   - 結果を記録

### その後実行すること

5. **フェーズ2-5の順次実行**
   - 各フェーズの結果を `docs/por/VM_CLUSTER_VALIDATION_RESULTS.md` に記録
   - 問題があれば対応タスクを作成

6. **検証完了後のアクション**
   - 検証結果をレビュー
   - 本番デプロイメントの準備

## 注意事項

- **ポート番号**: IAMは3000を使用（`validate-cluster.sh`の8080は古い設定）
- **既存スクリプト**: `validate-cluster.sh`はT036用で、一部設定が古い可能性がある
- **統合テスト計画**: T039.S6の計画（`S6-integration-test-plan.md`）を優先的に使用
- **T039の進行状況**: POR.mdの「Active Work」セクションで最新ステータスを確認
