]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/upgrade/upgrade.component.ts
update ceph source to reef 18.2.1
[ceph.git] / ceph / src / pybind / mgr / dashboard / frontend / src / app / ceph / cluster / upgrade / upgrade.component.ts
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/upgrade/upgrade.component.ts b/ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/upgrade/upgrade.component.ts
new file mode 100644 (file)
index 0000000..0f1f231
--- /dev/null
@@ -0,0 +1,145 @@
+import { Component, OnDestroy, OnInit } from '@angular/core';
+import { Observable, ReplaySubject, Subscription, of } from 'rxjs';
+import { catchError, publishReplay, refCount, shareReplay, switchMap, tap } from 'rxjs/operators';
+import { DaemonService } from '~/app/shared/api/daemon.service';
+import { HealthService } from '~/app/shared/api/health.service';
+import { UpgradeService } from '~/app/shared/api/upgrade.service';
+import { Icons } from '~/app/shared/enum/icons.enum';
+import { NotificationType } from '~/app/shared/enum/notification-type.enum';
+import { CdTableColumn } from '~/app/shared/models/cd-table-column';
+import { Daemon } from '~/app/shared/models/daemon.interface';
+import { Permission } from '~/app/shared/models/permissions';
+import { UpgradeInfoInterface } from '~/app/shared/models/upgrade.interface';
+import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
+import { NotificationService } from '~/app/shared/services/notification.service';
+import { SummaryService } from '~/app/shared/services/summary.service';
+import { ModalService } from '~/app/shared/services/modal.service';
+import { UpgradeStartModalComponent } from './upgrade-form/upgrade-start-modal.component';
+import { ExecutingTask } from '~/app/shared/models/executing-task';
+import { Router } from '@angular/router';
+import { RefreshIntervalService } from '~/app/shared/services/refresh-interval.service';
+
+@Component({
+  selector: 'cd-upgrade',
+  templateUrl: './upgrade.component.html',
+  styleUrls: ['./upgrade.component.scss']
+})
+export class UpgradeComponent implements OnInit, OnDestroy {
+  version: string;
+  info$: Observable<UpgradeInfoInterface>;
+  permission: Permission;
+  healthData$: Observable<any>;
+  daemons$: Observable<Daemon[]>;
+  fsid$: Observable<any>;
+  modalRef: NgbModalRef;
+  upgradableVersions: string[];
+  errorMessage: string;
+  executingTasks: ExecutingTask;
+  interval = new Subscription();
+
+  columns: CdTableColumn[] = [];
+
+  icons = Icons;
+
+  upgradeStatus$: Observable<any>;
+  subject = new ReplaySubject<any>();
+
+  constructor(
+    private modalService: ModalService,
+    private summaryService: SummaryService,
+    private upgradeService: UpgradeService,
+    private healthService: HealthService,
+    private daemonService: DaemonService,
+    private notificationService: NotificationService,
+    private router: Router,
+    private refreshIntervalService: RefreshIntervalService
+  ) {}
+
+  ngOnInit(): void {
+    this.upgradeStatus$ = this.subject.pipe(
+      switchMap(() => this.upgradeService.status()),
+      shareReplay(1)
+    );
+
+    this.columns = [
+      {
+        name: $localize`Daemon name`,
+        prop: 'daemon_name',
+        flexGrow: 1,
+        filterable: true
+      },
+      {
+        name: $localize`Version`,
+        prop: 'version',
+        flexGrow: 1,
+        filterable: true
+      }
+    ];
+
+    this.summaryService.subscribe((summary) => {
+      const version = summary.version.replace('ceph version ', '').split('-');
+      this.version = version[0];
+      this.executingTasks = summary.executing_tasks.filter((tasks) =>
+        tasks.name.includes('progress/Upgrade')
+      )[0];
+    });
+
+    this.interval = this.refreshIntervalService.intervalData$.subscribe(() => {
+      this.fetchStatus();
+    });
+
+    this.info$ = this.upgradeService.list().pipe(
+      tap((upgradeInfo: UpgradeInfoInterface) => (this.upgradableVersions = upgradeInfo.versions)),
+      publishReplay(1),
+      refCount(),
+      catchError((err) => {
+        err.preventDefault();
+        this.errorMessage = $localize`Not retrieving upgrades`;
+        this.notificationService.show(
+          NotificationType.error,
+          this.errorMessage,
+          err.error.detail || err.error.message
+        );
+        return of(null);
+      })
+    );
+
+    this.healthData$ = this.healthService.getMinimalHealth();
+    this.daemons$ = this.daemonService.list(this.upgradeService.upgradableServiceTypes);
+    this.fsid$ = this.healthService.getClusterFsid();
+  }
+
+  startUpgradeModal() {
+    this.modalRef = this.modalService.show(UpgradeStartModalComponent, {
+      versions: this.upgradableVersions
+    });
+  }
+
+  fetchStatus() {
+    this.subject.next();
+  }
+
+  upgradeNow(version: string) {
+    this.upgradeService.start(version).subscribe({
+      error: (error) => {
+        this.notificationService.show(
+          NotificationType.error,
+          $localize`Failed to start the upgrade`,
+          error
+        );
+      },
+      complete: () => {
+        this.notificationService.show(
+          NotificationType.success,
+          $localize`Started upgrading the cluster`
+        );
+        this.fetchStatus();
+        this.router.navigate(['/upgrade/progress']);
+      }
+    });
+  }
+
+  ngOnDestroy() {
+    this.interval?.unsubscribe();
+  }
+}