2026-10-20 16:13:34 +09:00
<UserControl xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
2026-10-20 20:48:08 +09:00
xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
Background= "{StaticResource BgDarkBrush}" >
2026-10-20 16:13:34 +09:00
<Grid Margin= "24" >
<Grid.RowDefinitions>
<RowDefinition Height= "Auto" />
<RowDefinition Height= "Auto" />
<RowDefinition Height= "*" />
<RowDefinition Height= "Auto" />
</Grid.RowDefinitions>
<!-- Header -->
<StackPanel Grid.Row= "0" Margin= "0,0,0,20" >
<TextBlock Text= "NetApp 스토리지 관리" FontSize= "24" FontWeight= "Bold" Foreground= "{StaticResource TextPrimaryBrush}" />
<TextBlock Text= "NetApp ONTAP 스토리지의 Qtree, Quota 한도, CIFS/NFS 파일 공유를 통합 제어합니다."
FontSize= "13" Foreground= "{StaticResource TextSecondaryBrush}" Margin= "0,4,0,0" />
</StackPanel>
<!-- Top Cluster / SVM Selector Bar -->
<Border Grid.Row= "1" Style= "{StaticResource ModernCardStyle}" Margin= "0,0,0,16" Padding= "14" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width= "Auto" />
<ColumnDefinition Width= "200" />
<ColumnDefinition Width= "Auto" />
<ColumnDefinition Width= "200" />
<ColumnDefinition Width= "Auto" />
<ColumnDefinition Width= "*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column= "0" Text= "스토리지 클러스터:" Foreground= "{StaticResource TextSecondaryBrush}" VerticalAlignment= "Center" Margin= "0,0,10,0" />
<ComboBox Grid.Column= "1" x:Name= "CmbCluster" SelectedIndex= "0" Height= "32" Background= "#0F172A" Foreground= "{StaticResource TextPrimaryBrush}" Margin= "0,0,20,0" >
<ComboBoxItem Content= "cluster01-ontap.corp.local" />
<ComboBoxItem Content= "cluster02-backup.corp.local" />
</ComboBox>
<TextBlock Grid.Column= "2" Text= "SVM (Vserver):" Foreground= "{StaticResource TextSecondaryBrush}" VerticalAlignment= "Center" Margin= "0,0,10,0" />
<ComboBox Grid.Column= "3" x:Name= "CmbSvm" SelectedIndex= "0" Height= "32" Background= "#0F172A" Foreground= "{StaticResource TextPrimaryBrush}" Margin= "0,0,20,0" >
<ComboBoxItem Content= "svm_cifs_prod01" />
<ComboBoxItem Content= "svm_nfs_app01" />
</ComboBox>
<Button Grid.Column= "4" x:Name= "BtnRefreshStorage" Content= "새로고침" Style= "{StaticResource SecondaryButtonStyle}" />
<StackPanel Grid.Column= "5" Orientation= "Horizontal" HorizontalAlignment= "Right" VerticalAlignment= "Center" >
<Border Background= "#10B981" Width= "10" Height= "10" CornerRadius= "5" Margin= "0,0,6,0" />
<TextBlock Text= "ONTAP 9.14 API 정상" FontSize= "12" Foreground= "{StaticResource TextSecondaryBrush}" />
</StackPanel>
</Grid>
</Border>
<!-- Tab Content Area: Qtree, Quota, Shares -->
<TabControl Grid.Row= "2" Background= "Transparent" BorderThickness= "0" >
<TabControl.Resources>
<Style TargetType= "TabItem" >
<Setter Property= "FontSize" Value= "14" />
<Setter Property= "FontWeight" Value= "SemiBold" />
<Setter Property= "Foreground" Value= "{StaticResource TextSecondaryBrush}" />
<Setter Property= "Padding" Value= "18,10" />
<Setter Property= "Cursor" Value= "Hand" />
<Setter Property= "Template" >
<Setter.Value>
<ControlTemplate TargetType= "TabItem" >
<Border x:Name= "tabBorder" Background= "Transparent" BorderThickness= "0,0,0,2" BorderBrush= "Transparent" Margin= "0,0,10,6" >
<ContentPresenter ContentSource= "Header" Margin= "6,4" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property= "IsSelected" Value= "True" >
<Setter TargetName= "tabBorder" Property= "BorderBrush" Value= "{StaticResource PrimaryAccentBrush}" />
<Setter Property= "Foreground" Value= "{StaticResource TextPrimaryBrush}" />
</Trigger>
<Trigger Property= "IsMouseOver" Value= "True" >
<Setter Property= "Foreground" Value= "{StaticResource PrimaryAccentHoverBrush}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</TabControl.Resources>
<!-- TAB 1: QTREE MANAGEMENT -->
<TabItem Header= " Qtree 관리" >
<Grid Margin= "0,12,0,0" >
<Grid.RowDefinitions>
<RowDefinition Height= "Auto" />
<RowDefinition Height= "*" />
</Grid.RowDefinitions>
<DockPanel Grid.Row= "0" Margin= "0,0,0,12" >
<StackPanel Orientation= "Horizontal" >
<TextBox x:Name= "TxtQtreeSearch" Width= "220" Style= "{StaticResource ModernTextBoxStyle}" Margin= "0,0,8,0" />
<Button x:Name= "BtnQtreeFilter" Content= "검색" Style= "{StaticResource SecondaryButtonStyle}" />
</StackPanel>
<StackPanel Orientation= "Horizontal" HorizontalAlignment= "Right" >
<Button x:Name= "BtnNewQtree" Content= "+ 새 Qtree 생성" Style= "{StaticResource PrimaryButtonStyle}" Margin= "0,0,8,0" />
<Button x:Name= "BtnEditQtree" Content= "보안 스타일 변경" Style= "{StaticResource SecondaryButtonStyle}" Margin= "0,0,8,0" />
<Button x:Name= "BtnDeleteQtree" Content= "삭제" Style= "{StaticResource SecondaryButtonStyle}" />
</StackPanel>
</DockPanel>
<Border Grid.Row= "1" Style= "{StaticResource ModernCardStyle}" Margin= "0" Padding= "0" >
<DataGrid x:Name= "QtreeGrid" Style= "{StaticResource ModernDataGridStyle}" >
<DataGrid.Columns>
<DataGridTextColumn Header= "볼륨 (Volume)" Binding= "{Binding Volume}" Width= "160" />
<DataGridTextColumn Header= "Qtree 이름" Binding= "{Binding QtreeName}" Width= "160" />
<DataGridTextColumn Header= "보안 스타일 (Security)" Binding= "{Binding SecurityStyle}" Width= "130" />
<DataGridTextColumn Header= "Oplocks" Binding= "{Binding Oplocks}" Width= "100" />
<DataGridTextColumn Header= "상태" Binding= "{Binding Status}" Width= "100" />
<DataGridTextColumn Header= "전체 경로" Binding= "{Binding FullPath}" Width= "*" />
</DataGrid.Columns>
</DataGrid>
</Border>
</Grid>
</TabItem>
<!-- TAB 2: QUOTA MANAGEMENT -->
<TabItem Header= " Quota (용량 한도)" >
<Grid Margin= "0,12,0,0" >
<Grid.RowDefinitions>
<RowDefinition Height= "Auto" />
<RowDefinition Height= "*" />
</Grid.RowDefinitions>
<DockPanel Grid.Row= "0" Margin= "0,0,0,12" >
<StackPanel Orientation= "Horizontal" >
<TextBox x:Name= "TxtQuotaSearch" Width= "220" Style= "{StaticResource ModernTextBoxStyle}" Margin= "0,0,8,0" />
<Button x:Name= "BtnQuotaFilter" Content= "검색" Style= "{StaticResource SecondaryButtonStyle}" />
</StackPanel>
<StackPanel Orientation= "Horizontal" HorizontalAlignment= "Right" >
<Button x:Name= "BtnAddQuota" Content= "+ Quota 규칙 추가" Style= "{StaticResource PrimaryButtonStyle}" Margin= "0,0,8,0" />
<Button x:Name= "BtnModifyQuota" Content= "한도 조정 (Resize)" Style= "{StaticResource SecondaryButtonStyle}" Margin= "0,0,8,0" />
<Button x:Name= "BtnRecomputeQuota" Content= "Quota 재계산" Style= "{StaticResource SecondaryButtonStyle}" />
</StackPanel>
</DockPanel>
<Border Grid.Row= "1" Style= "{StaticResource ModernCardStyle}" Margin= "0" Padding= "0" >
<DataGrid x:Name= "QuotaGrid" Style= "{StaticResource ModernDataGridStyle}" >
<DataGrid.Columns>
<DataGridTextColumn Header= "대상 유형 (Type)" Binding= "{Binding QuotaType}" Width= "110" />
<DataGridTextColumn Header= "대상 (Target / User / Tree)" Binding= "{Binding Target}" Width= "180" />
<DataGridTextColumn Header= "볼륨 / Qtree" Binding= "{Binding VolumeQtree}" Width= "180" />
<DataGridTextColumn Header= "현재 사용량" Binding= "{Binding UsedSpace}" Width= "120" />
<DataGridTextColumn Header= "Soft Limit" Binding= "{Binding SoftLimit}" Width= "120" />
<DataGridTextColumn Header= "Hard Limit" Binding= "{Binding HardLimit}" Width= "120" />
<DataGridTextColumn Header= "사용률" Binding= "{Binding UsagePercent}" Width= "90" />
<DataGridTextColumn Header= "상태" Binding= "{Binding QuotaStatus}" Width= "*" />
</DataGrid.Columns>
</DataGrid>
</Border>
</Grid>
</TabItem>
<!-- TAB 3: SHARE MANAGEMENT -->
<TabItem Header= " 파일 공유 (CIFS / NFS)" >
<Grid Margin= "0,12,0,0" >
<Grid.RowDefinitions>
<RowDefinition Height= "Auto" />
<RowDefinition Height= "*" />
</Grid.RowDefinitions>
<DockPanel Grid.Row= "0" Margin= "0,0,0,12" >
<StackPanel Orientation= "Horizontal" >
<TextBox x:Name= "TxtShareSearch" Width= "220" Style= "{StaticResource ModernTextBoxStyle}" Margin= "0,0,8,0" />
<Button x:Name= "BtnShareFilter" Content= "검색" Style= "{StaticResource SecondaryButtonStyle}" />
</StackPanel>
<StackPanel Orientation= "Horizontal" HorizontalAlignment= "Right" >
<Button x:Name= "BtnNewShare" Content= "+ 신규 공유 생성" Style= "{StaticResource PrimaryButtonStyle}" Margin= "0,0,8,0" />
<Button x:Name= "BtnShareAcl" Content= "ACL / 접근 권한 관리" Style= "{StaticResource SecondaryButtonStyle}" Margin= "0,0,8,0" />
<Button x:Name= "BtnDeleteShare" Content= "공유 해제" Style= "{StaticResource SecondaryButtonStyle}" />
</StackPanel>
</DockPanel>
<Border Grid.Row= "1" Style= "{StaticResource ModernCardStyle}" Margin= "0" Padding= "0" >
<DataGrid x:Name= "ShareGrid" Style= "{StaticResource ModernDataGridStyle}" >
<DataGrid.Columns>
<DataGridTextColumn Header= "프로토콜" Binding= "{Binding Protocol}" Width= "90" />
<DataGridTextColumn Header= "공유 이름 (Share Name)" Binding= "{Binding ShareName}" Width= "160" />
<DataGridTextColumn Header= "마운트 / Qtree 경로" Binding= "{Binding Path}" Width= "260" />
<DataGridTextColumn Header= "설명 (Comment)" Binding= "{Binding Comment}" Width= "200" />
<DataGridTextColumn Header= "권한 요약" Binding= "{Binding AclSummary}" Width= "160" />
<DataGridTextColumn Header= "활성 세션 수" Binding= "{Binding ActiveSessions}" Width= "*" />
</DataGrid.Columns>
</DataGrid>
</Border>
</Grid>
</TabItem>
</TabControl>
<!-- Status Footer -->
<Border Grid.Row= "3" Margin= "0,12,0,0" >
<DockPanel>
<TextBlock x:Name= "TxtNetAppStatusMsg" Text= "스토리지 응답 정상 (REST API v2) - Active SVM: svm_cifs_prod01" FontSize= "12" Foreground= "{StaticResource TextSecondaryBrush}" />
<TextBlock x:Name= "TxtNetAppSummary" Text= "총 84개 Qtree, 48개 공유 활성화됨" FontSize= "12" Foreground= "{StaticResource TextSecondaryBrush}" HorizontalAlignment= "Right" />
</DockPanel>
</Border>
</Grid>
</UserControl>