diff --git a/ui/src/app/components/status/status.component.html b/ui/src/app/components/status/status.component.html
index 41262c8f7..facbb64a9 100644
--- a/ui/src/app/components/status/status.component.html
+++ b/ui/src/app/components/status/status.component.html
@@ -7,6 +7,7 @@
{{ disconnected ? 'Unknown' : rendering.display }}
+ 30">This may take a while.
diff --git a/ui/src/app/components/status/status.component.module.ts b/ui/src/app/components/status/status.component.module.ts
index 73d9bab53..2843cd574 100644
--- a/ui/src/app/components/status/status.component.module.ts
+++ b/ui/src/app/components/status/status.component.module.ts
@@ -2,6 +2,7 @@ import { NgModule } from '@angular/core'
import { CommonModule } from '@angular/common'
import { StatusComponent } from './status.component'
import { IonicModule } from '@ionic/angular'
+import { SharingModule } from 'src/app/modules/sharing.module'
@NgModule({
declarations: [
@@ -10,6 +11,7 @@ import { IonicModule } from '@ionic/angular'
imports: [
CommonModule,
IonicModule,
+ SharingModule,
],
exports: [StatusComponent],
})
diff --git a/ui/src/app/components/status/status.component.ts b/ui/src/app/components/status/status.component.ts
index 2232ea040..4c96cbbf6 100644
--- a/ui/src/app/components/status/status.component.ts
+++ b/ui/src/app/components/status/status.component.ts
@@ -1,5 +1,5 @@
import { Component, Input } from '@angular/core'
-import { StatusRendering } from 'src/app/services/pkg-status-rendering.service'
+import { PrimaryRendering, PrimaryStatus, StatusRendering } from 'src/app/services/pkg-status-rendering.service'
@Component({
selector: 'status',
@@ -7,11 +7,15 @@ import { StatusRendering } from 'src/app/services/pkg-status-rendering.service'
styleUrls: ['./status.component.scss'],
})
export class StatusComponent {
+ PS = PrimaryStatus
+ PR = PrimaryRendering
+
@Input() rendering: StatusRendering
@Input() size?: string
@Input() style?: string = 'regular'
@Input() weight?: string = 'normal'
@Input() disconnected?: boolean = false
@Input() installProgress?: number
+ @Input() sigtermTimeout?: string
}
diff --git a/ui/src/app/modules/sharing.module.ts b/ui/src/app/modules/sharing.module.ts
index b1eec84ef..afebba63d 100644
--- a/ui/src/app/modules/sharing.module.ts
+++ b/ui/src/app/modules/sharing.module.ts
@@ -11,6 +11,7 @@ import { NotificationColorPipe } from '../pipes/notification-color.pipe'
import { InstallState } from '../pipes/install-state.pipe'
import { TextSpinnerComponentModule } from '../components/text-spinner/text-spinner.component.module'
import { ConvertBytesPipe } from '../pipes/convert-bytes.pipe'
+import { DurationToSecondsPipe } from '../pipes/unit-conversion.pipe'
@NgModule({
declarations: [
@@ -30,6 +31,7 @@ import { ConvertBytesPipe } from '../pipes/convert-bytes.pipe'
EmptyPipe,
NotificationColorPipe,
ConvertBytesPipe,
+ DurationToSecondsPipe,
],
imports: [
TextSpinnerComponentModule,
@@ -51,6 +53,7 @@ import { ConvertBytesPipe } from '../pipes/convert-bytes.pipe'
EmptyPipe,
NotificationColorPipe,
ConvertBytesPipe,
+ DurationToSecondsPipe,
// components
TextSpinnerComponentModule,
],
diff --git a/ui/src/app/pages/apps-routes/app-list/app-list-pkg/app-list-pkg.component.html b/ui/src/app/pages/apps-routes/app-list/app-list-pkg/app-list-pkg.component.html
index 61565e1fe..a3c6a8c0a 100644
--- a/ui/src/app/pages/apps-routes/app-list/app-list-pkg/app-list-pkg.component.html
+++ b/ui/src/app/pages/apps-routes/app-list/app-list-pkg/app-list-pkg.component.html
@@ -16,6 +16,7 @@
[installProgress]="pkg.installProgress?.totalProgress"
weight="bold"
size="small"
+ [sigtermTimeout]="manifest.main['sigterm-timeout']"
>
diff --git a/ui/src/app/pages/apps-routes/app-show/app-show.page.html b/ui/src/app/pages/apps-routes/app-show/app-show.page.html
index 8404262ba..3f2020e6e 100644
--- a/ui/src/app/pages/apps-routes/app-show/app-show.page.html
+++ b/ui/src/app/pages/apps-routes/app-show/app-show.page.html
@@ -29,6 +29,7 @@
weight="500"
[installProgress]="installProgress?.totalProgress"
[rendering]="PR[statuses.primary]"
+ [sigtermTimeout]="pkg.manifest.main['sigterm-timeout']"
>
diff --git a/ui/src/app/pipes/unit-conversion.pipe.ts b/ui/src/app/pipes/unit-conversion.pipe.ts
new file mode 100644
index 000000000..b43d6c6d6
--- /dev/null
+++ b/ui/src/app/pipes/unit-conversion.pipe.ts
@@ -0,0 +1,24 @@
+import { Pipe, PipeTransform } from '@angular/core'
+
+@Pipe({
+ name: 'durationToSeconds',
+})
+export class DurationToSecondsPipe implements PipeTransform {
+ transform (duration: string | null): number {
+ if (!duration) return 0
+ const splitUnit = duration.match(/^([0-9]*(\.[0-9]+)?)(ns|µs|ms|s|m|d)$/)
+ const unit = splitUnit[3]
+ const num = splitUnit[1]
+ return Number(num) * unitsToSeconds[unit]
+ }
+}
+
+const unitsToSeconds = {
+ 'ns': 1e-9,
+ 'µs': 1e-6,
+ 'ms': 0.001,
+ 's': 1,
+ 'm': 60,
+ 'h': 3600,
+ 'd': 86400,
+}
\ No newline at end of file
diff --git a/ui/src/app/services/api/api.fixures.ts b/ui/src/app/services/api/api.fixures.ts
index 26c3e36da..76bb78373 100644
--- a/ui/src/app/services/api/api.fixures.ts
+++ b/ui/src/app/services/api/api.fixures.ts
@@ -51,6 +51,7 @@ export module Mock {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': '1ms',
},
'health-checks': { },
'config': {
@@ -102,6 +103,7 @@ export module Mock {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
'restore': {
'type': 'docker',
@@ -113,6 +115,7 @@ export module Mock {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
},
'migrations': null,
@@ -135,6 +138,7 @@ export module Mock {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
'input-spec': {
'reason': {
@@ -361,6 +365,7 @@ export module Mock {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': '10000µs',
},
'health-checks': { },
'config': {
@@ -412,6 +417,7 @@ export module Mock {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
'restore': {
'type': 'docker',
@@ -423,6 +429,7 @@ export module Mock {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
},
'migrations': null,
@@ -444,6 +451,7 @@ export module Mock {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
'input-spec': null,
},
@@ -503,6 +511,7 @@ export module Mock {
'io-format': DockerIoFormat.Yaml,
inject: false,
'shm-size': '',
+ 'sigterm-timeout': '1m',
},
'health-checks': { },
config: { get: { } as any, set: { } as any },
@@ -536,6 +545,7 @@ export module Mock {
'io-format': DockerIoFormat.Yaml,
inject: false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
restore: {
type: 'docker',
@@ -547,6 +557,7 @@ export module Mock {
'io-format': DockerIoFormat.Yaml,
inject: false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
},
migrations: null,
@@ -570,6 +581,7 @@ export module Mock {
'io-format': DockerIoFormat.Cbor,
inject: false,
'shm-size': '10m',
+ 'sigterm-timeout': null,
},
'auto-configure': {
type: 'docker',
@@ -581,6 +593,7 @@ export module Mock {
'io-format': DockerIoFormat.Cbor,
inject: false,
'shm-size': '10m',
+ 'sigterm-timeout': null,
},
},
},
diff --git a/ui/src/app/services/api/mock-patch.ts b/ui/src/app/services/api/mock-patch.ts
index 4b0c23a34..bac9a344e 100644
--- a/ui/src/app/services/api/mock-patch.ts
+++ b/ui/src/app/services/api/mock-patch.ts
@@ -69,6 +69,7 @@ export const mockPatchData: DataModel = {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': '.49m',
},
'health-checks': {
'chain-state': { 'name': 'Chain State', 'description': 'Checks the chainstate' },
@@ -126,6 +127,7 @@ export const mockPatchData: DataModel = {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
'restore': {
'type': 'docker',
@@ -137,6 +139,7 @@ export const mockPatchData: DataModel = {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
},
'migrations': null,
@@ -159,6 +162,7 @@ export const mockPatchData: DataModel = {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
'input-spec': {
'reason': {
@@ -446,6 +450,7 @@ export const mockPatchData: DataModel = {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': '0.5s',
},
'health-checks': { },
'config': {
@@ -497,6 +502,7 @@ export const mockPatchData: DataModel = {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
'restore': {
'type': 'docker',
@@ -508,6 +514,7 @@ export const mockPatchData: DataModel = {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
},
'migrations': null,
@@ -529,6 +536,7 @@ export const mockPatchData: DataModel = {
'io-format': DockerIoFormat.Yaml,
'inject': false,
'shm-size': '',
+ 'sigterm-timeout': null,
},
'input-spec': null,
},
diff --git a/ui/src/app/services/patch-db/data-model.ts b/ui/src/app/services/patch-db/data-model.ts
index 5e2f31fab..a1fd0516d 100644
--- a/ui/src/app/services/patch-db/data-model.ts
+++ b/ui/src/app/services/patch-db/data-model.ts
@@ -144,6 +144,7 @@ export interface ActionImpl {
'io-format': DockerIoFormat | null
inject: boolean
'shm-size': string
+ 'sigterm-timeout': string | null
}
export enum DockerIoFormat {