diff --git a/kotsadm/pkg/apiserver/server.go b/kotsadm/pkg/apiserver/server.go index 038c9e2653..3262fa91d9 100644 --- a/kotsadm/pkg/apiserver/server.go +++ b/kotsadm/pkg/apiserver/server.go @@ -108,6 +108,7 @@ func Start() { r.Path("/api/v1/license/resume").Methods("OPTIONS", "PUT").HandlerFunc(handlers.ResumeInstallOnline) r.Path("/api/v1/registry").Methods("OPTIONS", "GET").HandlerFunc(handlers.GetKotsadmRegistry) + r.Path("/api/v1/imagerewritestatus").Methods("OPTIONS", "GET").HandlerFunc(handlers.GetImageRewriteStatus) r.Path("/api/v1/metadata").Methods("OPTIONS", "GET").HandlerFunc(handlers.Metadata) r.Path("/api/v1/app/{appSlug}/registry").Methods("OPTIONS", "PUT").HandlerFunc(handlers.UpdateAppRegistry) diff --git a/kotsadm/pkg/handlers/image_rewrite_status.go b/kotsadm/pkg/handlers/image_rewrite_status.go new file mode 100644 index 0000000000..c54f704dd1 --- /dev/null +++ b/kotsadm/pkg/handlers/image_rewrite_status.go @@ -0,0 +1,51 @@ +package handlers + +import ( + "net/http" + + "github.com/replicatedhq/kots/kotsadm/pkg/logger" + "github.com/replicatedhq/kots/kotsadm/pkg/session" + "github.com/replicatedhq/kots/kotsadm/pkg/task" +) + +type GetImageRewriteStatusResponse struct { + Status string `json:"status"` + CurrentMessage string `json:"currentMessage"` +} + +func GetImageRewriteStatus(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Headers", "content-type, origin, accept, authorization") + + if r.Method == "OPTIONS" { + w.WriteHeader(200) + return + } + + sess, err := session.Parse(r.Header.Get("Authorization")) + if err != nil { + logger.Error(err) + w.WriteHeader(401) + return + } + + // we don't currently have roles, all valid tokens are valid sessions + if sess == nil || sess.ID == "" { + w.WriteHeader(401) + return + } + + status, message, err := task.GetTaskStatus("image-rewrite") + if err != nil { + logger.Error(err) + w.WriteHeader(500) + return + } + + getImageRewriteStatusResponse := GetImageRewriteStatusResponse{ + Status: status, + CurrentMessage: message, + } + + JSON(w, 200, getImageRewriteStatusResponse) +} diff --git a/kotsadm/pkg/handlers/license.go b/kotsadm/pkg/handlers/license.go index 7013150c34..014b3e82ae 100644 --- a/kotsadm/pkg/handlers/license.go +++ b/kotsadm/pkg/handlers/license.go @@ -97,7 +97,7 @@ func SyncLicense(w http.ResponseWriter, r *http.Request) { sess, err := session.Parse(r.Header.Get("Authorization")) if err != nil { logger.Error(err) - w.WriteHeader(500) + w.WriteHeader(401) return } @@ -245,7 +245,7 @@ func UploadNewLicense(w http.ResponseWriter, r *http.Request) { sess, err := session.Parse(r.Header.Get("Authorization")) if err != nil { logger.Error(err) - w.WriteHeader(500) + w.WriteHeader(401) return } @@ -387,7 +387,7 @@ func ResumeInstallOnline(w http.ResponseWriter, r *http.Request) { if err != nil { logger.Error(err) resumeInstallOnlineResponse.Error = err.Error() - JSON(w, 500, resumeInstallOnlineResponse) + JSON(w, 401, resumeInstallOnlineResponse) return } diff --git a/kotsadm/pkg/handlers/registry.go b/kotsadm/pkg/handlers/registry.go index ee77da92dc..e94712a465 100644 --- a/kotsadm/pkg/handlers/registry.go +++ b/kotsadm/pkg/handlers/registry.go @@ -86,7 +86,7 @@ func UpdateAppRegistry(w http.ResponseWriter, r *http.Request) { return } - currentStatus, err := task.GetTaskStatus("image-rewrite") + currentStatus, _, err := task.GetTaskStatus("image-rewrite") if err != nil { logger.Error(err) updateAppRegistryResponse.Error = err.Error() diff --git a/kotsadm/pkg/task/task.go b/kotsadm/pkg/task/task.go index 8f576956fb..a1b01bb2fa 100644 --- a/kotsadm/pkg/task/task.go +++ b/kotsadm/pkg/task/task.go @@ -45,19 +45,21 @@ func ClearTaskStatus(id string) error { return nil } -func GetTaskStatus(id string) (string, error) { +func GetTaskStatus(id string) (string, string, error) { db := persistence.MustGetPGSession() - query := `select status from api_task_status where id = $1 AND updated_at > ($2::timestamp - '10 seconds'::interval)` - + query := `select status, current_message from api_task_status where id = $1 AND updated_at > ($2::timestamp - '10 seconds'::interval)` row := db.QueryRow(query, id, time.Now()) - status := "" - if err := row.Scan(&status); err != nil { + + var status sql.NullString + var message sql.NullString + + if err := row.Scan(&status, &message); err != nil { if err == sql.ErrNoRows { - return "", nil + return "", "", nil } - return "", errors.Wrap(err, "failed to scan task status") + return "", "", errors.Wrap(err, "failed to scan task status") } - return status, nil + return status.String, message.String, nil } diff --git a/kotsadm/pkg/updatechecker/updatechecker.go b/kotsadm/pkg/updatechecker/updatechecker.go index a5621e914c..892694ea35 100644 --- a/kotsadm/pkg/updatechecker/updatechecker.go +++ b/kotsadm/pkg/updatechecker/updatechecker.go @@ -143,7 +143,7 @@ func Stop(appID string) { // if "deploy" is set to true, the latest version/update will be deployed // returns the number of available updates func CheckForUpdates(appID string, deploy bool) (int64, error) { - currentStatus, err := task.GetTaskStatus("update-download") + currentStatus, _, err := task.GetTaskStatus("update-download") if err != nil { return 0, errors.Wrap(err, "failed to get task status") } diff --git a/kotsadm/web/src/components/shared/AirgapRegistrySettings.jsx b/kotsadm/web/src/components/shared/AirgapRegistrySettings.jsx index 1884ccac8c..9f8e32afe0 100644 --- a/kotsadm/web/src/components/shared/AirgapRegistrySettings.jsx +++ b/kotsadm/web/src/components/shared/AirgapRegistrySettings.jsx @@ -206,46 +206,56 @@ class AirgapRegistrySettings extends Component { } triggerStatusUpdates = () => { - this.props.client.query({ - query: getImageRewriteStatus, - variables: {}, - fetchPolicy: "no-cache", - }).then((res) => { - this.setState({ - rewriteStatus: res.data.getImageRewriteStatus.status, - rewriteMessage: res.data.getImageRewriteStatus.currentMessage, + fetch(`${window.env.API_ENDPOINT}/imagerewritestatus`, { + headers: { + "Authorization": Utilities.getToken(), + "Content-Type": "application/json", + }, + method: "GET", + }) + .then(async (response) => { + const res = await response.json(); + this.setState({ + rewriteStatus: res.status, + rewriteMessage: res.currentMessage, + }); + if (res.status !== "running") { + return; + } + this.state.updateChecker.start(this.updateStatus, 1000); + }) + .catch((err) => { + console.log("failed to get rewrite status", err); }); - if (res.data.getImageRewriteStatus.status !== "running") { - return; - } - this.state.updateChecker.start(this.updateStatus, 1000); - }).catch((err) => { - console.log("failed to get rewrite status", err); - }); } updateStatus = () => { return new Promise((resolve, reject) => { - this.props.client.query({ - query: getImageRewriteStatus, - fetchPolicy: "no-cache", - }).then((res) => { - - this.setState({ - rewriteStatus: res.data.getImageRewriteStatus.status, - rewriteMessage: res.data.getImageRewriteStatus.currentMessage, - }); + fetch(`${window.env.API_ENDPOINT}/imagerewritestatus`, { + headers: { + "Authorization": Utilities.getToken(), + "Content-Type": "application/json", + }, + method: "GET", + }) + .then(async (response) => { + const res = await response.json(); - if (res.data.getImageRewriteStatus.status !== "running") { - this.state.updateChecker.stop(); - } + this.setState({ + rewriteStatus: res.status, + rewriteMessage: res.currentMessage, + }); - resolve(); + if (res.status !== "running") { + this.state.updateChecker.stop(); + } - }).catch((err) => { - console.log("failed to get rewrite status", err); - reject(); - }) + resolve(); + }) + .catch((err) => { + console.log("failed to get rewrite status", err); + reject(); + }); }); }