};
navigations = [
- { menu: 'NFS', component: 'cd-error' },
- {
- menu: 'Object Gateway',
- submenus: [
- { menu: 'Gateways', component: 'cd-rgw-daemon-list' },
- { menu: 'Users', component: 'cd-rgw-user-list' },
- { menu: 'Buckets', component: 'cd-rgw-bucket-list' }
- ]
- },
{ menu: 'Dashboard', component: 'cd-dashboard' },
{
menu: 'Cluster',
submenus: [
+ { menu: 'Pools', component: 'cd-pool-list' },
{ menu: 'Hosts', component: 'cd-hosts' },
- { menu: 'Physical Disks', component: 'cd-error' },
- { menu: 'Monitors', component: 'cd-monitor' },
- { menu: 'Services', component: 'cd-error' },
{ menu: 'OSDs', component: 'cd-osd-list' },
- { menu: 'Configuration', component: 'cd-configuration' },
+ { menu: 'Physical Disks', component: 'cd-error' },
{ menu: 'CRUSH map', component: 'cd-crushmap' },
- { menu: 'Manager Modules', component: 'cd-mgr-module-list' },
- { menu: 'Ceph Users', component: 'cd-crud-table' },
- { menu: 'Logs', component: 'cd-logs' },
- { menu: 'Alerts', component: 'cd-prometheus-tabs' }
+ { menu: 'Monitors', component: 'cd-monitor' }
]
},
- { menu: 'Pools', component: 'cd-pool-list' },
{
menu: 'Block',
submenus: [
{ menu: 'iSCSI', component: 'cd-iscsi' }
]
},
- { menu: 'File Systems', component: 'cd-cephfs-list' }
+ {
+ menu: 'Object',
+ submenus: [
+ { menu: 'Overview', component: 'cd-rgw-overview-dashboard' },
+ { menu: 'Buckets', component: 'cd-rgw-bucket-list' },
+ { menu: 'Users', component: 'cd-rgw-user-list' },
+ { menu: 'Multi-site', component: 'cd-rgw-multisite-details' },
+ { menu: 'Gateways', component: 'cd-rgw-daemon-list' },
+ { menu: 'NFS', component: 'cd-error' }
+ ]
+ },
+ {
+ menu: 'File',
+ submenus: [
+ { menu: 'File Systems', component: 'cd-cephfs-list' },
+ { menu: 'NFS', component: 'cd-error' }
+ ]
+ },
+ {
+ menu: 'Observability',
+ submenus: [
+ { menu: 'Logs', component: 'cd-logs' },
+ { menu: 'Alerts', component: 'cd-prometheus-tabs' }
+ ]
+ },
+ {
+ menu: 'Administration',
+ submenus: [
+ { menu: 'Services', component: 'cd-error' },
+ { menu: 'Upgrade', component: 'cd-error' },
+ { menu: 'Ceph Users', component: 'cd-crud-table' },
+ { menu: 'Manager Modules', component: 'cd-mgr-module-list' },
+ { menu: 'Configuration', component: 'cd-configuration' }
+ ]
+ }
];
getVerticalMenu() {
path: 'ceph-users',
component: CRUDTableComponent,
data: {
- breadcrumbs: 'Cluster/Ceph Users',
+ breadcrumbs: 'Administration/Ceph Users',
resource: 'api.cluster.user@1.0'
}
},
path: 'cluster/user/create',
component: CrudFormComponent,
data: {
- breadcrumbs: 'Cluster/Ceph Users/Create',
+ breadcrumbs: 'Administration/Ceph Users/Create',
resource: 'api.cluster.user@1.0'
}
},
path: 'cluster/user/import',
component: CrudFormComponent,
data: {
- breadcrumbs: 'Cluster/Ceph Users/Import',
+ breadcrumbs: 'Administration/Ceph Users/Import',
resource: 'api.cluster.user@1.0'
}
},
path: 'cluster/user/edit',
component: CrudFormComponent,
data: {
- breadcrumbs: 'Cluster/Ceph Users/Edit',
+ breadcrumbs: 'Administration/Ceph Users/Edit',
resource: 'api.cluster.user@1.0'
}
},
section_info: 'Orchestrator',
header: 'Orchestrator is not available'
},
- breadcrumbs: 'Cluster/Services'
+ breadcrumbs: 'Administration/Services'
},
children: [
{
},
{
path: 'configuration',
- data: { breadcrumbs: 'Cluster/Configuration' },
+ data: { breadcrumbs: 'Administration/Configuration' },
children: [
{ path: '', component: ConfigurationComponent },
{
{
path: 'logs',
component: LogsComponent,
- data: { breadcrumbs: 'Cluster/Logs' }
+ data: { breadcrumbs: 'Observability/Logs' }
},
{
path: 'telemetry',
},
{
path: 'monitoring',
- data: { breadcrumbs: 'Cluster/Alerts' },
+ data: { breadcrumbs: 'Observability/Alerts' },
children: [
{ path: '', redirectTo: 'active-alerts', pathMatch: 'full' },
{
section_info: 'Orchestrator',
header: 'Orchestrator is not available'
},
- breadcrumbs: 'Cluster/Upgrade'
+ breadcrumbs: 'Administration/Upgrade'
},
children: [
{
// Mgr modules
{
path: 'mgr-modules',
- data: { breadcrumbs: 'Cluster/Manager Modules' },
+ data: { breadcrumbs: 'Administrator/Manager Modules' },
children: [
{
path: '',
// Pools
{
path: 'pool',
- data: { breadcrumbs: 'Pools' },
+ data: { breadcrumbs: 'Cluster/Pools' },
loadChildren: () => import('./ceph/pool/pool.module').then((m) => m.RoutedPoolModule)
},
// Block
{
path: 'cephfs',
canActivate: [FeatureTogglesGuardService],
- data: { breadcrumbs: 'File Systems' },
+ data: { breadcrumbs: 'File/File Systems' },
children: [
{ path: '', component: CephfsListComponent },
{
header: 'The Object Gateway Service is not configured'
},
breadcrumbs: true,
- text: 'Object Gateway',
+ text: 'Object',
path: null
},
loadChildren: () => import('./ceph/rgw/rgw.module').then((m) => m.RoutedRgwModule)
<cd-notifications-sidebar></cd-notifications-sidebar>
<div class="cd-navbar-top">
<nav class="navbar navbar-expand-md navbar-dark cd-navbar-brand">
- <button class="btn btn-link py-0 ms-3"
+ <button class="btn btn-link py-0"
(click)="showMenuSidebar = !showMenuSidebar"
aria-label="toggle sidebar visibility">
- <i class="fa fa-bars fa-2x"
+ <i [ngClass]="[icons.bars, icons.large2x]"
aria-hidden="true"></i>
</button>
(click)="toggleRightSidebar()">
<span i18n
class="sr-only">Toggle navigation</span>
- <span class="">
- <i class="fa fa-navicon fa-lg"></i>
+ <span>
+ <i [ngClass]="[icons.navicon, icons.large]"></i>
</span>
</button>
class="nav-item tc_menuitem_dashboard">
<a routerLink="/dashboard"
class="nav-link">
- <span i18n>Dashboard</span>
- <i [ngClass]="[icons.health]"
- [ngStyle]="summaryData?.health_status | healthColor"></i>
+ <span i18n>
+ <i [ngClass]="[icons.areaChart]"></i>
+ Dashboard</span>
+ <i
+ *ngIf="summaryData?.health_status !== 'HEALTH_OK'"
+ [ngClass]="[icons.circle]"
+ [ngStyle]="summaryData?.health_status | healthColor">
+ </i>
</a>
</li>
<li routerLinkActive="active"
class="nav-item tc_menuitem_cluster"
*ngIf="permissions.hosts.read || permissions.monitor.read ||
- permissions.osd.read || permissions.configOpt.read ||
- permissions.log.read || permissions.prometheus.read">
+ permissions.osd.read || permissions.pool.read">
<a (click)="toggleSubMenu('cluster')"
class="nav-link dropdown-toggle"
- [attr.aria-expanded]="displayedSubMenu === 'cluster'"
+ [attr.aria-expanded]="displayedSubMenu.cluster"
aria-controls="cluster-nav"
role="button">
- <ng-container i18n>Cluster</ng-container>
+ <ng-container i18n>
+ <i [ngClass]="[icons.sitemap]"></i>
+ Cluster
+ </ng-container>
</a>
<ul class="list-unstyled"
id="cluster-nav"
- [ngbCollapse]="displayedSubMenu !== 'cluster'">
+ [ngbCollapse]="!displayedSubMenu.cluster">
<li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_hosts"
- *ngIf="permissions.hosts.read">
- <a i18n
- routerLink="/hosts">Hosts</a>
- </li>
- <li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_cluster_inventory"
- *ngIf="permissions.hosts.read">
- <a i18n
- routerLink="/inventory">Physical Disks</a>
- </li>
- <li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_cluster_monitor"
- *ngIf="permissions.monitor.read">
+ class="tc_submenuitem tc_submenuitem_cluster_pool"
+ *ngIf="permissions.pool.read">
<a i18n
- routerLink="/monitor/">Monitors</a>
+ routerLink="/pool">Pools</a>
</li>
<li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_cluster_services"
+ class="tc_submenuitem tc_submenuitem_cluster_hosts"
*ngIf="permissions.hosts.read">
<a i18n
- routerLink="/services/">Services</a>
+ routerLink="/hosts">Hosts</a>
</li>
<li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_osds"
+ class="tc_submenuitem tc_submenuitem_cluster_osds"
*ngIf="permissions.osd.read">
<a i18n
routerLink="/osd">OSDs</a>
</li>
<li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_configuration"
- *ngIf="permissions.configOpt.read">
+ class="tc_submenuitem tc_submenuitem_cluster_inventory"
+ *ngIf="permissions.hosts.read">
<a i18n
- routerLink="/configuration">Configuration</a>
+ routerLink="/inventory">Physical Disks</a>
</li>
<li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_crush"
+ class="tc_submenuitem tc_submenuitem_cluster_crush"
*ngIf="permissions.osd.read">
<a i18n
routerLink="/crush-map">CRUSH map</a>
</li>
<li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_modules"
- *ngIf="permissions.configOpt.read">
- <a i18n
- routerLink="/mgr-modules">Manager Modules</a>
- </li>
- <li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_users"
- *ngIf="permissions.configOpt.read">
- <a i18n
- routerLink="/ceph-users">Ceph Users</a>
- </li>
- <li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_log"
- *ngIf="permissions.log.read">
- <a i18n
- routerLink="/logs">Logs</a>
- </li>
- <li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_monitoring"
- *ngIf="permissions.prometheus.read">
- <a routerLink="/monitoring">
- <ng-container i18n>Alerts</ng-container>
- <small *ngIf="prometheusAlertService.activeCriticalAlerts > 0"
- class="badge badge-danger ms-1">{{ prometheusAlertService.activeCriticalAlerts }}</small>
- <small *ngIf="prometheusAlertService.activeWarningAlerts > 0"
- class="badge badge-warning ms-1">{{ prometheusAlertService.activeWarningAlerts }}</small>
- </a>
- </li>
- <li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_upgrade"
- *ngIf="permissions.configOpt.read">
+ class="tc_submenuitem tc_submenuitem_cluster_monitor"
+ *ngIf="permissions.monitor.read">
<a i18n
- routerLink="/upgrade">Upgrade</a>
+ routerLink="/monitor/">Monitors</a>
</li>
</ul>
</li>
- <!-- Pools -->
- <li routerLinkActive="active"
- class="nav-item tc_menuitem_pool"
- *ngIf="permissions.pool.read">
- <a class="nav-link"
- i18n
- routerLink="/pool">Pools</a>
- </li>
-
- <!-- Block -->
+ <!-- Block Storage -->
<li routerLinkActive="active"
class="nav-item tc_menuitem_block"
*ngIf="(permissions.rbdImage.read || permissions.rbdMirroring.read || permissions.iscsi.read) &&
(enabledFeature.rbd || enabledFeature.mirroring || enabledFeature.iscsi)">
<a class="nav-link dropdown-toggle"
(click)="toggleSubMenu('block')"
- [attr.aria-expanded]="displayedSubMenu === 'block'"
+ [attr.aria-expanded]="displayedSubMenu.block"
aria-controls="block-nav"
role="button"
[ngStyle]="blockHealthColor()">
- <ng-container i18n>Block</ng-container>
+ <ng-container i18n>
+ <i [ngClass]="[icons.database]"></i>
+ Block
+ </ng-container>
</a>
<ul class="list-unstyled"
id="block-nav"
- [ngbCollapse]="displayedSubMenu !== 'block'">
+ [ngbCollapse]="!displayedSubMenu.block">
<li routerLinkActive="active"
class="tc_submenuitem tc_submenuitem_block_images"
*ngIf="permissions.rbdImage.read && enabledFeature.rbd">
</ul>
</li>
- <!-- NFS -->
- <li routerLinkActive="active"
- class="nav-item tc_menuitem_nfs"
- *ngIf="permissions.nfs.read && enabledFeature.nfs">
- <a i18n
- class="nav-link"
- routerLink="/nfs">NFS</a>
- </li>
-
- <!-- Filesystem -->
- <li routerLinkActive="active"
- class="nav-item tc_menuitem_cephfs"
- *ngIf="permissions.cephfs.read && enabledFeature.cephfs">
- <a i18n
- class="nav-link"
- routerLink="/cephfs">File Systems</a>
- </li>
-
- <!-- Object Gateway -->
+ <!-- Object Storage -->
<li routerLinkActive="active"
class="nav-item tc_menuitem_rgw"
*ngIf="permissions.rgw.read && enabledFeature.rgw">
<a class="nav-link dropdown-toggle"
- (click)="toggleSubMenu('rgw')"
- [attr.aria-expanded]="displayedSubMenu === 'rgw'"
+ (click)="toggleSubMenu('object')"
+ [attr.aria-expanded]="displayedSubMenu.object"
aria-controls="gateway-nav"
role="button">
- <ng-container i18n>Object Gateway</ng-container>
+ <ng-container i18n>
+ <i [ngClass]="[icons.cubes]"></i>
+ Object
+ </ng-container>
</a>
<ul class="list-unstyled"
id="gateway-nav"
- [ngbCollapse]="displayedSubMenu !== 'rgw'">
+ [ngbCollapse]="!displayedSubMenu.object">
<li routerLinkActive="active"
class="tc_submenuitem tc_submenuitem_rgw_overview">
<a i18n
routerLink="/rgw/overview">Overview</a>
</li>
<li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_rgw_daemons">
+ class="tc_submenuitem tc_submenuitem_rgw_buckets">
<a i18n
- routerLink="/rgw/daemon">Gateways</a>
+ routerLink="/rgw/bucket">Buckets</a>
</li>
<li routerLinkActive="active"
class="tc_submenuitem tc_submenuitem_rgw_users">
<li routerLinkActive="active"
class="tc_submenuitem tc_submenuitem_rgw_buckets">
<a i18n
- routerLink="/rgw/bucket">Buckets</a>
+ routerLink="/rgw/multisite">Multi-site</a>
</li>
<li routerLinkActive="active"
- class="tc_submenuitem tc_submenuitem_rgw_buckets">
+ class="tc_submenuitem tc_submenuitem_rgw_daemons">
+ <a i18n
+ routerLink="/rgw/daemon">Gateways</a>
+ </li>
+ <li routerLinkActive="active"
+ class="tc_submenuitem tc_submenuitem_rgw_nfs"
+ *ngIf="permissions.nfs.read && enabledFeature.nfs">
<a i18n
- routerLink="/rgw/multisite">Multi-Site</a>
+ class="nav-link"
+ routerLink="/nfs">NFS</a>
+ </li>
+ </ul>
+ </li>
+
+ <!-- Filesystem -->
+ <li routerLinkActive="active"
+ class="nav-item tc_menuitem_file"
+ *ngIf="permissions.nfs.read && enabledFeature.nfs
+ || permissions.cephfs.read && enabledFeature.cephfs">
+ <a class="nav-link dropdown-toggle"
+ (click)="toggleSubMenu('file')"
+ [attr.aria-expanded]="displayedSubMenu.file"
+ aria-controls="filesystem-nav"
+ role="button">
+ <ng-container i18n>
+ <i [ngClass]="[icons.text]"></i>
+ File
+ </ng-container>
+ </a>
+ <ul class="list-unstyled"
+ id="filesystem-nav"
+ [ngbCollapse]="!displayedSubMenu.file">
+ <li routerLinkActive="active"
+ class="tc_submenuitem tc_submenuitem_file_cephfs"
+ *ngIf="permissions.cephfs.read && enabledFeature.cephfs">
+ <a i18n
+ class="nav-link"
+ routerLink="/cephfs">File Systems</a>
+ </li>
+ <li routerLinkActive="active"
+ class="tc_submenuitem tc_submenuitem_file_nfs"
+ *ngIf="permissions.nfs.read && enabledFeature.nfs">
+ <a i18n
+ class="nav-link"
+ routerLink="/nfs">NFS</a>
+ </li>
+ </ul>
+ </li>
+
+
+ <!-- Observability -->
+ <li routerLinkActive="active"
+ class="nav-item tc_menuitem_observe"
+ *ngIf="permissions.log.read || permissions.prometheus.read">
+ <a class="nav-link dropdown-toggle"
+ (click)="toggleSubMenu('observe')"
+ [attr.aria-expanded]="displayedSubMenu.observe"
+ aria-controls="observe-nav"
+ role="button">
+ <ng-container i18n>
+ <i [ngClass]="[icons.eye]"></i>
+ Observability
+ </ng-container>
+ </a>
+ <ul class="list-unstyled"
+ id="observe-nav"
+ [ngbCollapse]="!displayedSubMenu.observe">
+ <li routerLinkActive="active"
+ class="tc_submenuitem tc_submenuitem_observe_log"
+ *ngIf="permissions.log.read">
+ <a i18n
+ routerLink="/logs">Logs</a>
+ </li>
+ <li routerLinkActive="active"
+ class="tc_submenuitem tc_submenuitem_observe_monitoring"
+ *ngIf="permissions.prometheus.read">
+ <a routerLink="/monitoring">
+ <ng-container i18n>Alerts</ng-container>
+ <small *ngIf="prometheusAlertService.activeCriticalAlerts > 0"
+ class="badge badge-danger ms-1">{{ prometheusAlertService.activeCriticalAlerts }}</small>
+ <small *ngIf="prometheusAlertService.activeWarningAlerts > 0"
+ class="badge badge-warning ms-1">{{ prometheusAlertService.activeWarningAlerts }}</small>
+ </a>
+ </li>
+ </ul>
+ </li>
+ <li routerLinkActive="active"
+ class="nav-item tc_menuitem_admin"
+ *ngIf="permissions.configOpt.read ||
+ permissions.hosts.read">
+ <a class="nav-link dropdown-toggle"
+ (click)="toggleSubMenu('admin')"
+ [attr.aria-expanded]="displayedSubMenu.admin"
+ aria-controls="admin-nav"
+ role="button">
+ <ng-container i18n>
+ <i [ngClass]="[icons.cogs]"></i>
+ Administration
+ </ng-container>
+ </a>
+ <ul class="list-unstyled"
+ id="admin-nav"
+ [ngbCollapse]="!displayedSubMenu.admin">
+ <li routerLinkActive="active"
+ class="tc_submenuitem tc_submenuitem_admin_services"
+ *ngIf="permissions.hosts.read">
+ <a i18n
+ routerLink="/services/">Services</a>
+ </li>
+ <li routerLinkActive="active"
+ class="tc_submenuitem tc_submenuitem_admin_upgrade"
+ *ngIf="permissions.configOpt.read">
+ <a i18n
+ routerLink="/upgrade">Upgrade</a>
+ </li>
+ <li routerLinkActive="active"
+ class="tc_submenuitem tc_submenuitem_admin_users"
+ *ngIf="permissions.configOpt.read">
+ <a i18n
+ routerLink="/ceph-users">Ceph Users</a>
+ </li>
+ <li routerLinkActive="active"
+ class="tc_submenuitem tc_submenuitem_admin_modules"
+ *ngIf="permissions.configOpt.read">
+ <a i18n
+ routerLink="/mgr-modules">Manager Modules</a>
+ </li>
+ <li routerLinkActive="active"
+ class="tc_submenuitem tc_submenuitem_admin_configuration"
+ *ngIf="permissions.configOpt.read">
+ <a i18n
+ routerLink="/configuration">Configuration</a>
</li>
</ul>
</li>
[
['hosts'],
[
- '.tc_submenuitem_hosts',
+ '.tc_submenuitem_cluster_hosts',
'.tc_submenuitem_cluster_inventory',
- '.tc_submenuitem_cluster_services'
+ '.tc_submenuitem_admin_services'
]
],
[['monitor'], ['.tc_submenuitem_cluster_monitor']],
- [['osd'], ['.tc_submenuitem_osds', '.tc_submenuitem_crush']],
+ [['osd'], ['.tc_submenuitem_cluster_osds', '.tc_submenuitem_cluster_crush']],
[
['configOpt'],
[
- '.tc_submenuitem_configuration',
- '.tc_submenuitem_modules',
- '.tc_submenuitem_users',
- '.tc_submenuitem_upgrade'
+ '.tc_submenuitem_admin_configuration',
+ '.tc_submenuitem_admin_modules',
+ '.tc_submenuitem_admin_users',
+ '.tc_submenuitem_admin_upgrade'
]
],
- [['log'], ['.tc_submenuitem_log']],
- [['prometheus'], ['.tc_submenuitem_monitoring']],
- [['pool'], ['.tc_menuitem_pool']],
+ [['log'], ['.tc_submenuitem_observe_log']],
+ [['prometheus'], ['.tc_submenuitem_observe_monitoring']],
+ [['pool'], ['.tc_submenuitem_cluster_pool']],
[['rbdImage'], ['.tc_submenuitem_block_images']],
[['rbdMirroring'], ['.tc_submenuitem_block_mirroring']],
[['iscsi'], ['.tc_submenuitem_block_iscsi']],
[['rbdImage', 'rbdMirroring', 'iscsi'], ['.tc_menuitem_block']],
- [['nfs'], ['.tc_menuitem_nfs']],
- [['cephfs'], ['.tc_menuitem_cephfs']],
+ [['nfs'], ['.tc_submenuitem_file_nfs']],
+ [['cephfs'], ['.tc_submenuitem_file_cephfs']],
[
['rgw'],
[
[['mirroring'], ['.tc_submenuitem_block_mirroring']],
[['iscsi'], ['.tc_submenuitem_block_iscsi']],
[['rbd', 'mirroring', 'iscsi'], ['.tc_menuitem_block']],
- [['nfs'], ['.tc_menuitem_nfs']],
- [['cephfs'], ['.tc_menuitem_cephfs']],
+ [['nfs'], ['.tc_submenuitem_file_nfs']],
+ [['cephfs'], ['.tc_submenuitem_file_cephfs']],
[
['rgw'],
[