]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/api/host.service.ts
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / pybind / mgr / dashboard / frontend / src / app / shared / api / host.service.ts
index cfe53305d431852976a721d993ec753daee0fb82..74c0c30d449678c69fcfa01180350abefe5edfc2 100644 (file)
@@ -1,20 +1,23 @@
-import { HttpClient } from '@angular/common/http';
+import { HttpClient, HttpParams } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 
-import { Observable } from 'rxjs';
-import { map } from 'rxjs/operators';
+import _ from 'lodash';
+import { Observable, of as observableOf } from 'rxjs';
+import { map, mergeMap, toArray } from 'rxjs/operators';
 
+import { InventoryDevice } from '~/app/ceph/cluster/inventory/inventory-devices/inventory-device.model';
+import { InventoryHost } from '~/app/ceph/cluster/inventory/inventory-host.model';
 import { Daemon } from '../models/daemon.interface';
 import { CdDevice } from '../models/devices';
 import { SmartDataResponseV1 } from '../models/smart';
 import { DeviceService } from '../services/device.service';
-import { ApiModule } from './api.module';
 
 @Injectable({
-  providedIn: ApiModule
+  providedIn: 'root'
 })
 export class HostService {
   baseURL = 'api/host';
+  baseUIURL = 'ui-api/host';
 
   constructor(private http: HttpClient, private deviceService: DeviceService) {}
 
@@ -45,10 +48,86 @@ export class HostService {
   }
 
   getLabels(): Observable<string[]> {
-    return this.http.get<string[]>('ui-api/host/labels');
+    return this.http.get<string[]>(`${this.baseUIURL}/labels`);
   }
 
-  update(hostname: string, labels: string[]) {
-    return this.http.put(`${this.baseURL}/${hostname}`, { labels: labels });
+  update(
+    hostname: string,
+    updateLabels = false,
+    labels: string[] = [],
+    maintenance = false,
+    force = false
+  ) {
+    return this.http.put(`${this.baseURL}/${hostname}`, {
+      update_labels: updateLabels,
+      labels: labels,
+      maintenance: maintenance,
+      force: force
+    });
+  }
+
+  identifyDevice(hostname: string, device: string, duration: number) {
+    return this.http.post(`${this.baseURL}/${hostname}/identify_device`, {
+      device,
+      duration
+    });
+  }
+
+  private getInventoryParams(refresh?: boolean): HttpParams {
+    let params = new HttpParams();
+    if (refresh) {
+      params = params.append('refresh', _.toString(refresh));
+    }
+    return params;
+  }
+
+  /**
+   * Get inventory of a host.
+   *
+   * @param hostname the host query.
+   * @param refresh true to ask the Orchestrator to refresh inventory.
+   */
+  getInventory(hostname: string, refresh?: boolean): Observable<InventoryHost> {
+    const params = this.getInventoryParams(refresh);
+    return this.http.get<InventoryHost>(`${this.baseURL}/${hostname}/inventory`, {
+      params: params
+    });
+  }
+
+  /**
+   * Get inventories of all hosts.
+   *
+   * @param refresh true to ask the Orchestrator to refresh inventory.
+   */
+  inventoryList(refresh?: boolean): Observable<InventoryHost[]> {
+    const params = this.getInventoryParams(refresh);
+    return this.http.get<InventoryHost[]>(`${this.baseUIURL}/inventory`, { params: params });
+  }
+
+  /**
+   * Get device list via host inventories.
+   *
+   * @param hostname the host to query. undefined for all hosts.
+   * @param refresh true to ask the Orchestrator to refresh inventory.
+   */
+  inventoryDeviceList(hostname?: string, refresh?: boolean): Observable<InventoryDevice[]> {
+    let observable;
+    if (hostname) {
+      observable = this.getInventory(hostname, refresh).pipe(toArray());
+    } else {
+      observable = this.inventoryList(refresh);
+    }
+    return observable.pipe(
+      mergeMap((hosts: InventoryHost[]) => {
+        const devices = _.flatMap(hosts, (host) => {
+          return host.devices.map((device) => {
+            device.hostname = host.name;
+            device.uid = device.device_id ? device.device_id : `${device.hostname}-${device.path}`;
+            return device;
+          });
+        });
+        return observableOf(devices);
+      })
+    );
   }
 }