Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion dashboard/pkg/epinio/components/application/AppInfo.vue
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ onMounted(() => {
chart: moveBooleansToFront(props.application.chart?.settings) || {},
configuration: {
configurations: props.application.configuration?.configurations || [],
instances: props.application.configuration?.instances || 1,
instances: props.application.configuration?.instances ?? 1,
environment: props.application.configuration?.environment || {},
settings: props.application.configuration?.settings || {},
routes: props.application.configuration?.routes || [],
Expand Down
2 changes: 1 addition & 1 deletion dashboard/pkg/epinio/components/application/AppSource.vue
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ function onManifestFileSelected(file: string) {
},
configuration: {
configurations: parsed.configuration?.configurations || [],
instances: parsed.configuration.instances || 1,
instances: parsed.configuration.instances ?? 1,
environment: parsed.configuration.environment || {},
settings: parsed.configuration?.settings || {},
routes: parsed.configuration.routes || []
Expand Down
15 changes: 13 additions & 2 deletions dashboard/pkg/epinio/edit/applications.vue
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,18 @@ const canEditConfig = computed(() => {
// If the user lacks config write perms, never show the primary "Edit Config" footer button,
// regardless of how this dialog was opened (view or edit route).
const hideEditConfigButton = computed(() => !canEditConfig.value);
const validationPassed = computed(() => !Object.values(tabErrors).find((error) => error));
const validationPassed = computed(() => {
const tabsValid = !Object.values(tabErrors).find((error) => error);
return tabsValid;
});

const shouldRestartOnSave = computed(() => {
const previousInstances = Number(props.initialValue?.configuration?.instances ?? props.initialValue?.desiredInstances ?? 0);
const nextInstances = Number(props.value?.configuration?.instances ?? props.value?.desiredInstances ?? 0);
const instancesChanged = previousInstances !== nextInstances;

return props.value?.canRestartAfterConfigSave || instancesChanged;
});

const done = () => {
if (!doneRoute) {
Expand All @@ -117,7 +128,7 @@ const done = () => {
async function save(saveCb: (success: boolean) => void) {
errors.value = [];
try {
await props.value.update();
await props.value.update({ restart: shouldRestartOnSave.value });

await props.value.updateConfigurations(
props.initialValue.baseConfigurationsNames || [],
Expand Down
4 changes: 4 additions & 0 deletions dashboard/pkg/epinio/models/applications.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@ export default class EpinioApplicationModel extends EpinioNamespacedResource {
return !!(base && canEditConfig);
}

get canRestartAfterConfigSave() {
return this.status === STATES.RUNNING && !!this.image_url;
}

get details() {
const res = [];

Expand Down
57 changes: 39 additions & 18 deletions dashboard/pkg/epinio/utils/errors.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,47 @@
import { isArray } from '@shell/utils/array';

export function epinioExceptionToErrorsArray(err: any): any {
if (err?.errors?.length === 1) {
return epinioExceptionToErrorsArray(err?.errors[0]);
}
const formatError = (item: any) => {
if (!item) {
return '';
}

if (typeof item === 'string') {
return item;
}

if ( err?.response?.data ) {
const body = err.response.data;
const status = item.status ? `[${ item.status }] ` : '';
const title = item.title || item.message || '';
const details = item.details || item.detail || '';

if ( body && body.message ) {
return [body.message];
} else {
return [err];
return `${ status }${ title }${ details ? ` - ${ details }` : '' }`.trim();
};

const normalize = (input: any): string[] => {
if (!input) {
return ['Unknown error'];
}

if (isArray(input)) {
return input.map(formatError).filter(Boolean);
}
} else if (err.status && err.title) {
const title = err.title;
const detail = err.detail ? ` - ${ err.detail }` : '';

return [`${ title }${ detail }`];
} else if ( isArray(err) ) {
return err;
} else {
return [err];

if (input?.errors && isArray(input.errors)) {
return input.errors.map(formatError).filter(Boolean);
}

if (input?.message) {
return [input.message];
}

const formatted = formatError(input);

return formatted ? [formatted] : ['Unknown error'];
};

if (err?.response?.data) {
return normalize(err.response.data);
}

return normalize(err);
}
Loading