Skip to content

Commit aaa4f8f

Browse files
committed
Frontend changes and api and backend changes to delete server
Signed-off-by: Harshit Gupta <[email protected]>
1 parent 149ce1a commit aaa4f8f

File tree

4 files changed

+94
-27
lines changed

4 files changed

+94
-27
lines changed

api/manager/api.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,7 @@ func (s *Server) RegisterServer(inp RegisterServerRequest) error {
3636

3737
return s.db.CreateServerEntry(sinfo)
3838
}
39+
40+
type DeleteServerRequest struct {
41+
Server managertypes.ServerInfo `json:"server"`
42+
}

api/manager/server.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ func (s *Server) HandleRequests() {
185185
// Manger-specific
186186
rtr.HandleFunc("/manager-api/server/list", corsHandler(s.serverList))
187187
rtr.HandleFunc("/manager-api/server/register", corsHandler(s.serverRegister))
188+
rtr.HandleFunc("/manager-api/server/delete/", corsHandler(s.serverDelete))
188189

189190
// SPIRE server info calls
190191
rtr.HandleFunc("/manager-api/healthcheck/{server:.*}", corsHandler(s.apiServerProxyFunc("/api/v1/spire/healthcheck", http.MethodGet)))
@@ -330,3 +331,50 @@ func (s *Server) serverRegister(w http.ResponseWriter, r *http.Request) {
330331
return
331332
}
332333
}
334+
335+
func (s *Server) serverDelete(w http.ResponseWriter, r *http.Request) {
336+
fmt.Println("Endpoint Hit: Server Delete")
337+
338+
buf := new(strings.Builder)
339+
340+
n, err := io.Copy(buf, r.Body)
341+
if err != nil {
342+
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
343+
retError(w, emsg, http.StatusBadRequest)
344+
return
345+
}
346+
data := buf.String()
347+
348+
var input DeleteServerRequest
349+
if n == 0 {
350+
input = DeleteServerRequest{}
351+
} else {
352+
err := json.Unmarshal([]byte(data), &input)
353+
if err != nil {
354+
emsg := fmt.Sprintf("Error parsing data: %v", err.Error())
355+
retError(w, emsg, http.StatusBadRequest)
356+
return
357+
}
358+
}
359+
360+
if input.Server.Name == "" {
361+
retError(w, "Server name is missing", http.StatusBadRequest)
362+
return
363+
}
364+
365+
err = s.db.DeleteServer(input.Server.Name)
366+
if err != nil {
367+
emsg := fmt.Sprintf("Error: %v", err.Error())
368+
retError(w, emsg, http.StatusInternalServerError)
369+
return
370+
}
371+
372+
cors(w, r)
373+
_, err = w.Write([]byte("SUCCESS"))
374+
375+
if err != nil {
376+
emsg := fmt.Sprintf("Error: %v", err.Error())
377+
retError(w, emsg, http.StatusInternalServerError)
378+
return
379+
}
380+
}

frontend/src/components/tornjak-api-helpers.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
ServerInfo,
1111
EntriesList,
1212
ClustersList,
13+
ServersList,
1314
DebugServerInfo,
1415
FederationsList
1516
} from './types';
@@ -344,6 +345,23 @@ class TornjakApi extends Component<TornjakApiProp, TornjakApiState> {
344345
return response.data;
345346
}
346347

348+
async serverDelete(inputData: { server: { name: string; }; }, serversListUpdateFunc: { (globalServersList: ServersList[]): void }, globalServersList: any[]) {
349+
const response = await axios.post(GetApiServerUri("/manager-api/server/delete/"), inputData,
350+
{
351+
crossdomain: true,
352+
})
353+
.then(function (response) {
354+
serversListUpdateFunc(globalServersList.filter(el =>
355+
el.name !== inputData))
356+
return response.data;
357+
})
358+
.catch(function (error) {
359+
return error.message;
360+
})
361+
return response;
362+
}
363+
364+
347365
// populateClustersUpdate returns the list of clusters with their info in manager mode for the selected server
348366
populateClustersUpdate = (serverName: string,
349367
clustersListUpdateFunc: { (globalClustersList: ClustersList[]): void; },

frontend/src/tables/servers-list-table.tsx

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import React from "react";
22
import { connect } from 'react-redux';
3-
// import IsManager from 'components/is_manager';
3+
import IsManager from 'components/is_manager';
44
import {
55
serversListUpdateFunc
66
} from 'redux/actions';
77
import Table from './list-table';
88
import { ServersList } from "components/types";
9-
// import { DenormalizedRow } from "carbon-components-react";
9+
import { DenormalizedRow } from "carbon-components-react";
1010
import { RootState } from "redux/reducers";
1111
import TornjakApi from 'components/tornjak-api-helpers';
1212

13+
14+
1315
// ServersListTable takes in
1416
// listTableData: servers data to be rendered on table
1517
// returns servers data inside a carbon component table with specified functions
@@ -50,7 +52,7 @@ class ServersListTable extends React.Component<ServersListTableProp, ServersList
5052
listTableData: [],
5153
};
5254
this.prepareTableData = this.prepareTableData.bind(this);
53-
// this.deleteServer = this.deleteServer.bind(this);
55+
this.deleteServer = this.deleteServer.bind(this);
5456
}
5557

5658
componentDidMount() {
@@ -85,30 +87,25 @@ class ServersListTable extends React.Component<ServersListTableProp, ServersList
8587
})
8688
}
8789

88-
//Note: future implementation - server delete function
89-
// keep code
90-
// deleteServer(selectedRows: readonly DenormalizedRow[]) {
91-
// if (!selectedRows || selectedRows.length === 0) return "";
92-
// let server: { name: string }[] = [], successMessage
90+
deleteServer(selectedRows: readonly DenormalizedRow[]) {
91+
if (!selectedRows || selectedRows.length === 0) return "";
92+
if (!IsManager) return "";
93+
let server: { name: string }[] = [], successMessage
9394

94-
// for (let i = 0; i < selectedRows.length; i++) {
95-
// server[i] = { name: selectedRows[i].cells[1].value };
96-
// if (IsManager) {
97-
// successMessage = this.TornjakApi.serverDelete(this.props.globalServerSelected, { server: server[i] }, this.props.serversListUpdateFunc, this.props.globalServersList);
98-
// } else {
99-
// successMessage = this.TornjakApi.localServerDelete({ server: server[i] }, this.props.serversListUpdateFunc, this.props.globalServersList);
100-
// }
101-
// successMessage.then(function (result) {
102-
// if (result === "SUCCESS") {
103-
// window.alert(`CLUSTER "${server[i].name}" DELETED SUCCESSFULLY!`);
104-
// window.location.reload();
105-
// } else {
106-
// window.alert(`Error deleting server "${server[i].name}": ` + result);
107-
// }
108-
// return;
109-
// })
110-
// }
111-
// }
95+
for (let i = 0; i < selectedRows.length; i++) {
96+
server[i] = { name: selectedRows[i].cells[1].value };
97+
successMessage = this.TornjakApi.serverDelete({ server: server[i] }, this.props.serversListUpdateFunc, this.props.globalServersList);
98+
successMessage.then(function (result) {
99+
if (result === "SUCCESS") {
100+
window.alert(`SERVER "${server[i].name}" DELETED SUCCESSFULLY!`);
101+
window.location.reload();
102+
} else {
103+
window.alert(`Error deleting server "${server[i].name}": ` + result);
104+
}
105+
return;
106+
})
107+
}
108+
}
112109

113110

114111
render() {
@@ -141,7 +138,7 @@ class ServersListTable extends React.Component<ServersListTableProp, ServersList
141138
entityType={"Server"}
142139
listTableData={listTableData}
143140
headerData={headerData}
144-
deleteEntity={undefined}
141+
deleteEntity={this.deleteServer}
145142
banEntity={undefined}
146143
downloadEntity={undefined} />
147144
</div>

0 commit comments

Comments
 (0)