+import { DatePipe } from '@angular/common';
import { Component, Input, OnChanges, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { Router } from '@angular/router';
import { OrchestratorFeature } from '~/app/shared/models/orchestrator.enum';
import { OrchestratorStatus } from '~/app/shared/models/orchestrator.interface';
import { Permissions } from '~/app/shared/models/permissions';
-import { CephServiceSpec } from '~/app/shared/models/service.interface';
+import {
+ CephCertificateStatus,
+ CephServiceCertificate,
+ CephServiceSpec
+} from '~/app/shared/models/service.interface';
import { RelativeDatePipe } from '~/app/shared/pipes/relative-date.pipe';
import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
selector: 'cd-services',
templateUrl: './services.component.html',
styleUrls: ['./services.component.scss'],
- providers: [{ provide: URLBuilderService, useValue: new URLBuilderService(BASE_URL) }],
+ providers: [DatePipe, { provide: URLBuilderService, useValue: new URLBuilderService(BASE_URL) }],
standalone: false
})
export class ServicesComponent extends ListWithDetails implements OnChanges, OnInit {
public runningTpl: TemplateRef<any>;
@ViewChild('urlTpl', { static: true })
public urlTpl: TemplateRef<any>;
+ @ViewChild('certificateStatusTpl', { static: true })
+ public certificateStatusTpl: TemplateRef<any>;
@Input() hostname: string;
private taskWrapperService: TaskWrapperService,
private router: Router,
private settingsService: SettingsService,
- private cdsModalService: ModalCdsService
+ private cdsModalService: ModalCdsService,
+ private datePipe: DatePipe
) {
super();
this.permissions = this.authStorageService.getPermissions();
undefined: '-',
'': '-'
}
+ },
+ {
+ name: $localize`Certificate Status`,
+ prop: 'certificate.status',
+ flexGrow: 2,
+ cellTemplate: this.certificateStatusTpl
}
];
this.serviceUrls[serviceType] = url;
});
}
+
+ formatCertificateStatus(cert: CephServiceCertificate): string {
+ if (!cert || !cert.requires_certificate || !cert.status) {
+ return '-';
+ }
+
+ const formattedDate = cert.expiry_date
+ ? this.datePipe.transform(cert.expiry_date, 'dd MMM y')
+ : null;
+
+ switch (cert.status) {
+ case CephCertificateStatus.valid:
+ return formattedDate ? $localize`Valid - ${formattedDate}` : $localize`Valid`;
+ case CephCertificateStatus.expiring:
+ case CephCertificateStatus.expiringSoon:
+ return formattedDate
+ ? $localize`Expiring soon - ${formattedDate}`
+ : $localize`Expiring soon`;
+ case CephCertificateStatus.expired:
+ return formattedDate ? $localize`Expired - ${formattedDate}` : $localize`Expired`;
+ case CephCertificateStatus.notConfigured:
+ return '-';
+ default:
+ return formattedDate ? `${cert.status} - ${formattedDate}` : cert.status;
+ }
+ }
}
created: Date;
}
+export enum CephCertificateStatus {
+ valid = 'valid',
+ expired = 'expired',
+ expiring = 'expiring',
+ expiringSoon = 'expiring_soon',
+ notConfigured = 'not_configured',
+ invalid = 'invalid'
+}
+
+export interface CephServiceCertificate {
+ cert_name: string;
+ scope: string;
+ requires_certificate: boolean;
+ status: CephCertificateStatus | string;
+ days_to_expiration: number;
+ signed_by: string;
+ has_certificate: boolean;
+ certificate_source: string;
+ expiry_date: string;
+}
+
// This will become handy when creating arbitrary services
export interface CephServiceSpec {
service_name: string;
service_id: string;
unmanaged: boolean;
status: CephServiceStatus;
+ certificate?: CephServiceCertificate;
spec: CephServiceAdditionalSpec;
placement: CephServicePlacement;
}