Skip to content

Commit

Permalink
Move delete snapshot mutation to go (#996)
Browse files Browse the repository at this point in the history
* move deleteSnapshot mutation to go
  • Loading branch information
sgalsaleh committed Aug 25, 2020
1 parent 11e2c1c commit 1d9e543
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 30 deletions.
1 change: 1 addition & 0 deletions kotsadm/pkg/apiserver/server.go
Expand Up @@ -146,6 +146,7 @@ func Start() {
// kotsadm snapshots
r.Path("/api/v1/snapshots").Methods("OPTIONS", "GET").HandlerFunc(handlers.ListKotsadmBackups)
r.Path("/api/v1/snapshot/{snapshotName}").Methods("OPTIONS", "GET").HandlerFunc(handlers.GetKotsadmBackup)
r.Path("/api/v1/snapshot/{snapshotName}/delete").Methods("OPTIONS", "POST").HandlerFunc(handlers.DeleteKotsadmBackup)
r.Path("/api/v1/velero").Methods("OPTIONS", "GET").HandlerFunc(handlers.GetVeleroStatus)

// App snapshot routes
Expand Down
33 changes: 33 additions & 0 deletions kotsadm/pkg/handlers/backup.go
Expand Up @@ -221,3 +221,36 @@ func GetKotsadmBackup(w http.ResponseWriter, r *http.Request) {

JSON(w, 200, getBackupResponse)
}

type DeleteKotsadmBackupResponse struct {
Success bool `json:"success"`
Error string `json:"error,omitempty"`
}

func DeleteKotsadmBackup(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(http.StatusOK)
return
}

if err := requireValidSession(w, r); err != nil {
logger.Error(err)
return
}

deleteBackupResponse := DeleteKotsadmBackupResponse{}

if err := snapshot.DeleteBackup(mux.Vars(r)["snapshotName"]); err != nil {
logger.Error(err)
deleteBackupResponse.Error = "failed to delete backup"
JSON(w, http.StatusInternalServerError, deleteBackupResponse)
return
}

deleteBackupResponse.Success = true

JSON(w, http.StatusOK, deleteBackupResponse)
}
35 changes: 35 additions & 0 deletions kotsadm/pkg/snapshot/backup.go
Expand Up @@ -486,6 +486,41 @@ func GetBackup(snapshotName string) (*velerov1.Backup, error) {
return backup, nil
}

func DeleteBackup(snapshotName string) error {
bsl, err := FindBackupStoreLocation()
if err != nil {
return errors.Wrap(err, "failed to get velero namespace")
}

veleroNamespace := bsl.Namespace
veleroDeleteBackupRequest := &velerov1.DeleteBackupRequest{
ObjectMeta: metav1.ObjectMeta{
Name: snapshotName,
Namespace: veleroNamespace,
},
Spec: velerov1.DeleteBackupRequestSpec{
BackupName: snapshotName,
},
}

cfg, err := config.GetConfig()
if err != nil {
return errors.Wrap(err, "failed to get cluster config")
}

veleroClient, err := veleroclientv1.NewForConfig(cfg)
if err != nil {
return errors.Wrap(err, "failed to create clientset")
}

_, err = veleroClient.DeleteBackupRequests(veleroNamespace).Create(context.TODO(), veleroDeleteBackupRequest, metav1.CreateOptions{})
if err != nil {
return errors.Wrap(err, "failed to create delete backup request")
}

return nil
}

func GetKotsadmBackupDetail(ctx context.Context, backupName string) (*types.BackupDetail, error) {
cfg, err := config.GetConfig()
if err != nil {
Expand Down
55 changes: 31 additions & 24 deletions kotsadm/web/src/components/apps/AppSnapshots.jsx
@@ -1,5 +1,5 @@
import React, { Component } from "react";
import { graphql, compose, withApollo } from "react-apollo";
import { compose } from "react-apollo";
import { Link, withRouter } from "react-router-dom"
import Helmet from "react-helmet";
import Modal from "react-modal";
Expand All @@ -12,7 +12,6 @@ import Loader from "../shared/Loader";
import DeleteSnapshotModal from "../modals/DeleteSnapshotModal";
import RestoreSnapshotModal from "../modals/RestoreSnapshotModal";

import { deleteSnapshot } from "../../mutations/SnapshotMutations";
import "../../scss/components/snapshots/AppSnapshots.scss";
import { Utilities } from "../../utilities/utilities";

Expand Down Expand Up @@ -194,26 +193,42 @@ class AppSnapshots extends Component {
}

this.setState({ deletingSnapshot: true, deleteErr: false, deleteErrorMsg: "", snapshots: this.state.snapshots.map(s => s === snapshot ? fakeDeletionSnapshot : s) });
this.props
.deleteSnapshot(snapshot.name)
.then(() => {

fetch(`${window.env.API_ENDPOINT}/snapshot/${snapshot.name}/delete`, {
method: "POST",
headers: {
"Authorization": Utilities.getToken(),
"Content-Type": "application/json",
}
})
.then(async (res) => {
if (!res.ok && res.status === 401) {
Utilities.logoutUser();
return;
}

const response = await res.json();
if (response.error) {
this.setState({
deletingSnapshot: false,
deleteErr: true,
deleteErrorMsg: response.error,
});
return;
}

this.setState({
deletingSnapshot: false,
deleteSnapshotModal: false,
snapshotToDelete: ""
});
})
.catch(err => {
err.graphQLErrors.map(({ msg }) => {
this.setState({
deletingSnapshot: false,
deleteErr: true,
deleteErrorMsg: msg,
});
})
})
.finally(() => {
this.setState({ deletingSnapshot: false });
this.setState({
deletingSnapshot: false,
deleteErr: true,
deleteErrorMsg: err ? err.message : "Something went wrong, please try again.",
});
});
};

Expand Down Expand Up @@ -507,12 +522,4 @@ class AppSnapshots extends Component {
}
}

export default compose(
withApollo,
withRouter,
graphql(deleteSnapshot, {
props: ({ mutate }) => ({
deleteSnapshot: (snapshotName) => mutate({ variables: { snapshotName } })
})
}),
)(AppSnapshots);
export default compose(withRouter)(AppSnapshots);
6 changes: 0 additions & 6 deletions kotsadm/web/src/mutations/SnapshotMutations.js
@@ -1,11 +1,5 @@
import gql from "graphql-tag";

export const deleteSnapshot = gql`
mutation deleteSnapshot($snapshotName: String!) {
deleteSnapshot(snapshotName: $snapshotName)
}
`;

export const restoreSnapshotRaw = `
mutation restoreSnapshot($snapshotName: String!) {
restoreSnapshot(snapshotName: $snapshotName) {
Expand Down

0 comments on commit 1d9e543

Please sign in to comment.