Fixes for snapshot upload during onboarding (#7390)

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
This commit is contained in:
Joakim Sørensen 2020-10-19 15:24:25 +02:00 committed by GitHub
parent 7c51001c3c
commit eec4a91ad8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 42 additions and 23 deletions

View File

@ -1,4 +1,3 @@
import "../../../src/components/ha-file-upload";
import "@material/mwc-icon-button/mwc-icon-button"; import "@material/mwc-icon-button/mwc-icon-button";
import { mdiFolderUpload } from "@mdi/js"; import { mdiFolderUpload } from "@mdi/js";
import "@polymer/iron-input/iron-input"; import "@polymer/iron-input/iron-input";
@ -12,13 +11,15 @@ import {
} from "lit-element"; } from "lit-element";
import { fireEvent } from "../../../src/common/dom/fire_event"; import { fireEvent } from "../../../src/common/dom/fire_event";
import "../../../src/components/ha-circular-progress"; import "../../../src/components/ha-circular-progress";
import "../../../src/components/ha-file-upload";
import "../../../src/components/ha-svg-icon"; import "../../../src/components/ha-svg-icon";
import { extractApiErrorMessage } from "../../../src/data/hassio/common";
import { import {
HassioSnapshot, HassioSnapshot,
uploadSnapshot, uploadSnapshot,
} from "../../../src/data/hassio/snapshot"; } from "../../../src/data/hassio/snapshot";
import { HomeAssistant } from "../../../src/types";
import { showAlertDialog } from "../../../src/dialogs/generic/show-dialog-box"; import { showAlertDialog } from "../../../src/dialogs/generic/show-dialog-box";
import { HomeAssistant } from "../../../src/types";
declare global { declare global {
interface HASSDomEvents { interface HASSDomEvents {
@ -65,7 +66,7 @@ export class HassioUploadSnapshot extends LitElement {
} catch (err) { } catch (err) {
showAlertDialog(this, { showAlertDialog(this, {
title: "Upload failed", title: "Upload failed",
text: err.toString(), text: extractApiErrorMessage(err),
confirmText: "ok", confirmText: "ok",
}); });
} finally { } finally {

View File

@ -1,6 +1,7 @@
import "@material/mwc-button"; import "@material/mwc-button";
import { mdiClose, mdiDelete, mdiDownload, mdiHistory } from "@mdi/js"; import { mdiClose, mdiDelete, mdiDownload, mdiHistory } from "@mdi/js";
import { PaperCheckboxElement } from "@polymer/paper-checkbox/paper-checkbox"; import "@polymer/paper-checkbox/paper-checkbox";
import type { PaperCheckboxElement } from "@polymer/paper-checkbox/paper-checkbox";
import "@polymer/paper-input/paper-input"; import "@polymer/paper-input/paper-input";
import { import {
css, css,

View File

@ -22,8 +22,8 @@ export const hassioApiResultExtractor = <T>(response: HassioResponse<T>) =>
export const extractApiErrorMessage = (error: any): string => { export const extractApiErrorMessage = (error: any): string => {
return typeof error === "object" return typeof error === "object"
? typeof error.body === "object" ? typeof error.body === "object"
? error.body.message || "Unknown error, see logs" ? error.body.message || "Unknown error, see supervisor logs"
: error.body || "Unknown error, see logs" : error.body || error.message || "Unknown error, see supervisor logs"
: error; : error;
}; };

View File

@ -15,6 +15,10 @@ import { showSnapshotUploadDialog } from "../../hassio/src/dialogs/snapshot/show
import { navigate } from "../common/navigate"; import { navigate } from "../common/navigate";
import type { LocalizeFunc } from "../common/translations/localize"; import type { LocalizeFunc } from "../common/translations/localize";
import "../components/ha-card"; import "../components/ha-card";
import {
extractApiErrorMessage,
ignoredStatusCodes,
} from "../data/hassio/common";
import { makeDialogManager } from "../dialogs/make-dialog-manager"; import { makeDialogManager } from "../dialogs/make-dialog-manager";
import { ProvideHassLitMixin } from "../mixins/provide-hass-lit-mixin"; import { ProvideHassLitMixin } from "../mixins/provide-hass-lit-mixin";
import { haStyle } from "../resources/styles"; import { haStyle } from "../resources/styles";
@ -32,9 +36,9 @@ class OnboardingRestoreSnapshot extends ProvideHassLitMixin(LitElement) {
@property() public language!: string; @property() public language!: string;
@property({ type: Boolean }) private restoring = false; @property({ type: Boolean }) public restoring = false;
@internalProperty() private _log?: string; @internalProperty() private _log = "";
@internalProperty() private _showFullLog = false; @internalProperty() private _showFullLog = false;
@ -45,17 +49,15 @@ class OnboardingRestoreSnapshot extends ProvideHassLitMixin(LitElement) {
"ui.panel.page-onboarding.restore.in_progress" "ui.panel.page-onboarding.restore.in_progress"
)} )}
> >
${this._log ${this._showFullLog
? this._showFullLog ? html`<hassio-ansi-to-html .content=${this._log}>
? html`<hassio-ansi-to-html .content=${this._log}> </hassio-ansi-to-html>`
</hassio-ansi-to-html>` : html`<onboarding-loading></onboarding-loading>
: html`<onboarding-loading></onboarding-loading> <hassio-ansi-to-html
<hassio-ansi-to-html class="logentry"
class="logentry" .content=${this._lastLogEntry(this._log)}
.content=${this._lastLogEntry(this._log)} >
> </hassio-ansi-to-html>`}
</hassio-ansi-to-html>`
: ""}
<div class="card-actions"> <div class="card-actions">
<mwc-button @click=${this._toggeFullLog}> <mwc-button @click=${this._toggeFullLog}>
${this._showFullLog ${this._showFullLog
@ -83,7 +85,8 @@ class OnboardingRestoreSnapshot extends ProvideHassLitMixin(LitElement) {
(entry) => (entry) =>
!entry.includes("/supervisor/logs") && !entry.includes("/supervisor/logs") &&
!entry.includes("/supervisor/ping") && !entry.includes("/supervisor/ping") &&
!entry.includes("DEBUG") !entry.includes("DEBUG") &&
!entry.includes("TypeError: Failed to fetch")
) )
.join("\n") .join("\n")
.replace(/\s[A-Z]+\s\(\w+\)\s\[[\w.]+\]/gi, "") .replace(/\s[A-Z]+\s\(\w+\)\s\[[\w.]+\]/gi, "")
@ -116,19 +119,33 @@ class OnboardingRestoreSnapshot extends ProvideHassLitMixin(LitElement) {
const response = await fetch("/api/hassio/supervisor/logs", { const response = await fetch("/api/hassio/supervisor/logs", {
method: "GET", method: "GET",
}); });
if (response.status === 401) {
// If we get a unauthorized response, the restore is done
this._restoreDone();
} else if (
response.status &&
!ignoredStatusCodes.has(response.status)
) {
// Handle error responses
this._log += this._filterLogs(extractApiErrorMessage(response));
}
const logs = await response.text(); const logs = await response.text();
this._log = this._filterLogs(logs); this._log = this._filterLogs(logs);
if (this._log.match(/\d{2}:\d{2}:\d{2}\s.*Restore\s\w+\sdone/)) { if (this._log.match(/\d{2}:\d{2}:\d{2}\s.*Restore\s\w+\sdone/)) {
// The log indicates that the restore done, navigate the user back to base // The log indicates that the restore done, navigate the user back to base
navigate(this, "/", true); this._restoreDone();
location.reload();
} }
} catch (err) { } catch (err) {
this._log = err.toString(); this._log += this._filterLogs(err.toString());
} }
} }
} }
private _restoreDone(): void {
navigate(this, "/", true);
location.reload();
}
private _showSnapshotDialog(slug: string): void { private _showSnapshotDialog(slug: string): void {
showHassioSnapshotDialog(this, { showHassioSnapshotDialog(this, {
slug, slug,