# 画面設計書 188-WSFCディスク

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるWindows Server Failover Cluster（WSFC）ディスク情報取得機能の設計を定義する。

### 本画面の処理概要

フェイルオーバークラスター内のストレージリソースに関する包括的な情報を取得する。クラスター化されたディスク、利用可能ディスク、クラスター共有ボリューム（CSV）の状態、容量、ファイルシステム情報を提供する。

**業務上の目的・背景**：データベース管理者は、SQL Server Failover Cluster Instancesのストレージ健全性監視、容量計画、ストレージ関連の障害診断が必要である。この機能により、各クラスターディスクの使用状況、空き容量、ファイルシステム種別を確認し、ストレージボトルネックの特定や容量拡張の計画が可能になる。また、クラスタリング前の利用可能ディスクの確認やCSV構成の検証も行える。

**画面へのアクセス方法**：PowerShellコンソールから以下のコマンドを実行する：
- `Get-DbaWsfcDisk` - クラスター化されたディスクの取得
- `Get-DbaWsfcAvailableDisk` - 利用可能ディスクの取得
- `Get-DbaWsfcSharedVolume` - クラスター共有ボリュームの取得

**主要な操作・処理内容**：
1. Get-DbaWsfcResourceで物理ディスクリソースを取得
2. Get-CimAssociatedInstanceでディスク関連情報を照会
3. ディスク容量をdbasizeオブジェクトに変換
4. クラスター情報をプロパティに追加
5. 結果オブジェクトを出力

**画面遷移**：単独のCLIコマンド群として動作。内部でGet-DbaWsfcResource、Get-DbaWsfcClusterを呼び出す。

**権限による表示制御**：全てのWSFCコマンドは各メンバーノードでローカル管理者権限が必要。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 554 | Get-DbaWsfcDisk | 主機能 | WSFCディスクの取得 |
| 555 | Get-DbaWsfcAvailableDisk | 補助機能 | 利用可能ディスクの取得 |
| 693 | Get-DbaWsfcSharedVolume | 補助機能 | クラスター共有ボリュームの取得 |

## 画面種別

コマンドラインインターフェース（CLI）

## URL/ルーティング

PowerShellコマンド:
- `Get-DbaWsfcDisk`
- `Get-DbaWsfcAvailableDisk`
- `Get-DbaWsfcSharedVolume`

## 入出力項目

### Get-DbaWsfcDisk パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| ComputerName | DbaInstanceParameter[] | No | 対象クラスターまたはノード名（デフォルト: $env:COMPUTERNAME） |
| Credential | PSCredential | No | 代替認証用資格情報 |
| EnableException | switch | No | 例外を有効にするフラグ |

### Get-DbaWsfcAvailableDisk パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| ComputerName | DbaInstanceParameter[] | No | 対象クラスターまたはノード名（デフォルト: $env:COMPUTERNAME） |
| Credential | PSCredential | No | 代替認証用資格情報 |
| EnableException | switch | No | 例外を有効にするフラグ |

### Get-DbaWsfcSharedVolume パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| ComputerName | DbaInstanceParameter[] | No | 対象クラスターまたはノード名（デフォルト: $env:COMPUTERNAME） |
| Credential | PSCredential | No | 代替認証用資格情報 |
| EnableException | switch | No | 例外を有効にするフラグ |

## 表示項目

### Get-DbaWsfcDisk 出力

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ClusterName | string | クラスター名 |
| ClusterFqdn | string | クラスターFQDN |
| ResourceGroup | string | ディスクリソースの所有グループ |
| Disk | string | ディスクリソース名 |
| State | string | リソース状態（Online/Offline等） |
| FileSystem | string | ファイルシステム種別（NTFS/ReFS等） |
| Path | string | マウントパス |
| Label | string | ボリュームラベル |
| Size | dbasize | ディスク総容量 |
| Free | dbasize | 空き容量 |
| SerialNumber | string | ディスクシリアル番号 |

### 追加プロパティ（Select-Object *で取得可能）

| 項目名 | 説明 |
|--------|------|
| MountPoints | マウントポイント配列 |
| ClusterDisk | MSCluster_DiskのCIMオブジェクト |
| ClusterDiskPart | MSCluster_DiskPartitionのCIMオブジェクト |
| ClusterResource | MSCluster_ResourceのCIMオブジェクト |

### Get-DbaWsfcAvailableDisk 出力

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ClusterName | string | クラスター名 |
| ClusterFqdn | string | クラスターFQDN |
| State | string | ディスク状態 |
| Name | string | ディスク名称 |
| Id | string | 一意識別子（GUID等） |
| Size | uint64 | ディスク容量（バイト） |
| Number | uint32 | ディスク番号 |
| Status | string | 運用状態 |
| ConnectedNodes | string[] | アクセス可能ノード配列 |
| Signature | uint32 | MBRディスク署名 |
| GptGuid | string | GPTディスクGUID |
| ScsiPort | uint32 | SCSIポート番号 |
| ScsiBus | uint32 | SCSIバス識別子 |
| ScsiTargetID | uint32 | SCSIターゲットID |
| ScsiLUN | uint32 | SCSI論理ユニット番号 |

### Get-DbaWsfcSharedVolume 出力

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ClusterName | string | クラスター名 |
| ClusterFqdn | string | クラスターFQDN |
| State | string | CSV状態（Online/Offline等） |
| （その他） | - | ClusterSharedVolume WMIクラスの全プロパティ |

## イベント仕様

### 1-ディスク情報取得（Get-DbaWsfcDisk）

1. Get-DbaWsfcResourceでPhysical Disk種別のリソースを取得
2. 各リソースについてGet-CimAssociatedInstanceでMSCluster_Diskを取得
3. 各ディスクについてGet-CimAssociatedInstanceでMSCluster_DiskPartitionを取得
4. PSCustomObjectを構築（容量はdbasizeに変換）
5. Select-DefaultViewでデフォルト表示プロパティを設定して出力

### 2-利用可能ディスク取得（Get-DbaWsfcAvailableDisk）

1. Get-DbaWsfcClusterでクラスター情報取得
2. Get-DbaCmObjectでMSCluster_AvailableDiskを照会
3. State、ClusterName、ClusterFqdnをNotePropertyとして追加
4. オブジェクトを出力

### 3-共有ボリューム取得（Get-DbaWsfcSharedVolume）

1. Get-DbaWsfcClusterでクラスター情報取得
2. Get-DbaCmObjectでClusterSharedVolumeを照会
3. ClusterName、ClusterFqdn、StateをNotePropertyとして追加
4. オブジェクトを出力

## データベース更新仕様

### 操作別データベース影響一覧

この機能はデータベースへの更新操作を行わない。WMI/CIMクエリによる読み取り専用操作のみ。

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| ディスク情報取得 | WMI root\MSCluster | SELECT（読み取り） | ディスク構成情報の取得 |
| 利用可能ディスク取得 | WMI root\MSCluster | SELECT（読み取り） | 利用可能ディスク情報の取得 |
| 共有ボリューム取得 | WMI root\MSCluster | SELECT（読み取り） | CSV情報の取得 |

## メッセージ仕様

| 種別 | メッセージ | 発生条件 |
|------|----------|---------|
| Error | (WMI接続エラー) | クラスターへの接続失敗時 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| WMI接続エラー | Get-DbaCmObjectのエラーハンドリングに委譲 |
| クラスター情報取得失敗 | Get-DbaWsfcClusterのエラーハンドリングに委譲 |
| リソース情報取得失敗 | Get-DbaWsfcResourceのエラーハンドリングに委譲 |

## 備考

- WMI名前空間: root\MSCluster
- WMIクラス: MSCluster_Disk、MSCluster_DiskPartition、MSCluster_AvailableDisk、ClusterSharedVolume
- Get-DbaWsfcDiskは容量をdbasizeオブジェクトに変換し、単位変換（KB/MB/GB/TB）を可能にする
- Get-DbaWsfcAvailableDiskとGet-DbaWsfcSharedVolumeでは$resource変数が未定義のためGet-ResourceState呼び出しに問題がある可能性あり

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

ディスク情報出力オブジェクトの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaWsfcDisk.ps1 | `public/Get-DbaWsfcDisk.ps1` | PSCustomObjectの構造（行77-93）、dbasize変換 |
| 1-2 | Get-DbaWsfcAvailableDisk.ps1 | `public/Get-DbaWsfcAvailableDisk.ps1` | MSCluster_AvailableDiskのプロパティ |
| 1-3 | Get-DbaWsfcSharedVolume.ps1 | `public/Get-DbaWsfcSharedVolume.ps1` | ClusterSharedVolumeのプロパティ |

**読解のコツ**: Get-DbaWsfcDiskはPSCustomObjectを構築するため出力構造が明確。他の2つはWMIオブジェクトにNotePropertyを追加する形式。

#### Step 2: エントリーポイントを理解する

各関数の処理フローを把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaWsfcDisk.ps1 | `public/Get-DbaWsfcDisk.ps1` | Get-CimAssociatedInstanceによるディスク関連取得 |
| 2-2 | Get-DbaWsfcAvailableDisk.ps1 | `public/Get-DbaWsfcAvailableDisk.ps1` | MSCluster_AvailableDiskの照会 |
| 2-3 | Get-DbaWsfcSharedVolume.ps1 | `public/Get-DbaWsfcSharedVolume.ps1` | ClusterSharedVolumeの照会 |

**主要処理フロー（Get-DbaWsfcDisk）**:
1. **行70-71**: processブロック開始、ComputerNameループ
2. **行72**: Get-DbaWsfcResourceでPhysical Diskリソース取得
3. **行73-74**: リソースループ、Get-CimAssociatedInstanceでMSCluster_Disk取得
4. **行75-76**: ディスクループ、Get-CimAssociatedInstanceでMSCluster_DiskPartition取得
5. **行77-92**: PSCustomObject構築（Size/Freeをdbasizeに変換）
6. **行93**: Select-DefaultViewでデフォルト表示プロパティを設定

### プログラム呼び出し階層図

```
Get-DbaWsfcDisk (public/Get-DbaWsfcDisk.ps1)
    │
    ├─ Get-DbaWsfcResource
    │      └─ Where-Object Type -eq 'Physical Disk'
    │
    ├─ Get-CimAssociatedInstance
    │      └─ ResultClassName: MSCluster_Disk
    │
    ├─ Get-CimAssociatedInstance
    │      └─ ResultClassName: MSCluster_DiskPartition
    │
    └─ Select-DefaultView
           └─ デフォルト表示プロパティ設定

Get-DbaWsfcAvailableDisk (public/Get-DbaWsfcAvailableDisk.ps1)
    │
    ├─ Get-DbaWsfcCluster
    │
    ├─ Get-DbaCmObject
    │      └─ ClassName: MSCluster_AvailableDisk
    │
    └─ Add-Member (State, ClusterName, ClusterFqdn)

Get-DbaWsfcSharedVolume (public/Get-DbaWsfcSharedVolume.ps1)
    │
    ├─ Get-DbaWsfcCluster
    │
    ├─ Get-DbaCmObject
    │      └─ ClassName: ClusterSharedVolume
    │
    └─ Add-Member (ClusterName, ClusterFqdn, State)
```

### データフロー図

```
[入力]                        [処理]                              [出力]

ComputerName ────────────▶ Get-DbaWsfcDisk
                                    │
                                    ▼
                           Get-DbaWsfcResource
                           (Type = 'Physical Disk')
                                    │
                                    ▼
                           Get-CimAssociatedInstance
                           (MSCluster_Disk)
                                    │
                                    ▼
                           Get-CimAssociatedInstance
                           (MSCluster_DiskPartition)
                                    │
                                    ▼
                           PSCustomObject構築
                           (Size/Free -> dbasize変換)
                                    │
                                    ▼
                           [PSCustomObject]
                           ├─ ClusterName
                           ├─ ClusterFqdn
                           ├─ ResourceGroup
                           ├─ Disk
                           ├─ State
                           ├─ FileSystem
                           ├─ Path
                           ├─ Label
                           ├─ Size (dbasize)
                           ├─ Free (dbasize)
                           └─ SerialNumber
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaWsfcDisk.ps1 | `public/Get-DbaWsfcDisk.ps1` | ソース | クラスターディスク情報取得 |
| Get-DbaWsfcAvailableDisk.ps1 | `public/Get-DbaWsfcAvailableDisk.ps1` | ソース | 利用可能ディスク情報取得 |
| Get-DbaWsfcSharedVolume.ps1 | `public/Get-DbaWsfcSharedVolume.ps1` | ソース | クラスター共有ボリューム取得 |
| Get-DbaWsfcResource.ps1 | `public/Get-DbaWsfcResource.ps1` | ソース | リソース情報取得（Get-DbaWsfcDiskが使用） |
| Get-DbaWsfcCluster.ps1 | `public/Get-DbaWsfcCluster.ps1` | ソース | クラスター情報取得 |
| Get-DbaCmObject.ps1 | `public/Get-DbaCmObject.ps1` | ソース | WMIオブジェクト取得汎用関数 |
