Skip to content

Commit 0015c81

Browse files
Add support for getExperimentRun and podLog graphql queries
1 parent 32f3232 commit 0015c81

File tree

3 files changed

+185
-2
lines changed

3 files changed

+185
-2
lines changed

pkg/apis/experiment/experiment.go

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ func GetExperimentList(pid string, in model.ListExperimentRequest, cred types.Cr
248248
// GetExperimentRunsList sends GraphQL API request for fetching a list of experiment runs.
249249
func GetExperimentRunsList(pid string, in model.ListExperimentRunRequest, cred types.Credentials) (ExperimentRunListData, error) {
250250

251-
var gqlReq GetChaosExperimentRunGraphQLRequest
251+
var gqlReq GetChaosExperimentRunsGraphQLRequest
252252
var err error
253253

254254
gqlReq.Query = ListExperimentRunsQuery
@@ -295,6 +295,56 @@ func GetExperimentRunsList(pid string, in model.ListExperimentRunRequest, cred t
295295
}
296296
}
297297

298+
// GetExperimentRun sends GraphQL API request for fetching an experiment run.
299+
func GetExperimentRun(pid string, nid string, cred types.Credentials) (ExperimentRunData, error) {
300+
301+
var gqlReq GetChaosExperimentRunGraphQLRequest
302+
var err error
303+
304+
gqlReq.Query = ExperimentRunsQuery
305+
gqlReq.Variables.ProjectID = pid
306+
gqlReq.Variables.NotifyID = nid
307+
308+
query, err := json.Marshal(gqlReq)
309+
if err != nil {
310+
return ExperimentRunData{}, err
311+
}
312+
313+
resp, err := apis.SendRequest(
314+
apis.SendRequestParams{
315+
Endpoint: cred.ServerEndpoint + utils.GQLAPIPath,
316+
Token: cred.Token,
317+
},
318+
query,
319+
string(types.Post),
320+
)
321+
if err != nil {
322+
return ExperimentRunData{}, err
323+
}
324+
325+
bodyBytes, err := io.ReadAll(resp.Body)
326+
defer resp.Body.Close()
327+
if err != nil {
328+
return ExperimentRunData{}, err
329+
}
330+
331+
if resp.StatusCode == http.StatusOK {
332+
var experimentRun ExperimentRunData
333+
err = json.Unmarshal(bodyBytes, &experimentRun)
334+
if err != nil {
335+
return ExperimentRunData{}, err
336+
}
337+
338+
if len(experimentRun.Errors) > 0 {
339+
return ExperimentRunData{}, errors.New(experimentRun.Errors[0].Message)
340+
}
341+
342+
return experimentRun, nil
343+
} else {
344+
return ExperimentRunData{}, errors.New("error while fetching the Chaos Experiment run")
345+
}
346+
}
347+
298348
// DeleteChaosExperiment sends GraphQL API request for deleting a given Chaos Experiment.
299349
func DeleteChaosExperiment(projectID string, experimentID *string, cred types.Credentials) (DeleteChaosExperimentData, error) {
300350

@@ -346,3 +396,51 @@ func DeleteChaosExperiment(projectID string, experimentID *string, cred types.Cr
346396
return DeleteChaosExperimentData{}, errors.New("Error while deleting the Chaos Experiment")
347397
}
348398
}
399+
400+
// GetPodLogs sends GraphQL API request for fetching logs for a given Chaos Experiment.
401+
func GetPodLogs(podLogReq PodLogRequest, cred types.Credentials) (PodLogData, error) {
402+
403+
var gqlReq GetPodLogsGraphQLRequest
404+
var err error
405+
406+
gqlReq.Query = GetPodLogsQuery
407+
gqlReq.Variables.Request = podLogReq
408+
409+
query, err := json.Marshal(gqlReq)
410+
if err != nil {
411+
return PodLogData{}, err
412+
}
413+
414+
resp, err := apis.SendRequest(
415+
apis.SendRequestParams{
416+
Endpoint: cred.ServerEndpoint + utils.GQLAPIPath,
417+
Token: cred.Token,
418+
},
419+
query,
420+
string(types.Post),
421+
)
422+
if err != nil {
423+
return PodLogData{}, err
424+
}
425+
bodyBytes, err := io.ReadAll(resp.Body)
426+
defer resp.Body.Close()
427+
if err != nil {
428+
return PodLogData{}, err
429+
}
430+
431+
if resp.StatusCode == http.StatusOK {
432+
var podLogData PodLogData
433+
err = json.Unmarshal(bodyBytes, &podLogData)
434+
if err != nil {
435+
return PodLogData{}, err
436+
}
437+
438+
if len(podLogData.Errors) > 0 {
439+
return PodLogData{}, errors.New(podLogData.Errors[0].Message)
440+
}
441+
442+
return podLogData, nil
443+
} else {
444+
return PodLogData{}, errors.New("error while fetching logs")
445+
}
446+
}

pkg/apis/experiment/query.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,41 @@ const (
4444
}
4545
}
4646
}`
47+
48+
ExperimentRunsQuery = `query getExperimentRun($projectID: ID!, $experimentRunID: ID, $notifyID: ID) {
49+
getExperimentRun(
50+
projectID: $projectID
51+
experimentRunID: $experimentRunID
52+
notifyID: $notifyID
53+
)
54+
{
55+
experimentRunID
56+
experimentID
57+
experimentName
58+
infra {
59+
name
60+
infraID
61+
}
62+
updatedAt
63+
updatedBy{
64+
username
65+
}
66+
phase
67+
resiliencyScore
68+
executionData
69+
}
70+
}`
4771
DeleteExperimentQuery = `mutation deleteChaosExperiment($projectID: ID!, $experimentID: String!, $experimentRunID: String) {
4872
deleteChaosExperiment(
4973
projectID: $projectID
5074
experimentID: $experimentID
5175
experimentRunID: $experimentRunID
5276
)
5377
}`
78+
GetPodLogsQuery = `subscription podLog($request: PodLogRequest!) {
79+
getPodLog(request: $request) {
80+
log
81+
__typename
82+
}
83+
}`
5484
)

pkg/apis/experiment/types.go

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@ type GetChaosExperimentsGraphQLRequest struct {
5454
} `json:"variables"`
5555
}
5656

57+
type ExperimentRunData struct {
58+
Errors []struct {
59+
Message string `json:"message"`
60+
Path []string `json:"path"`
61+
} `json:"errors"`
62+
Data ExperimentRun `json:"data"`
63+
}
64+
65+
type ExperimentRun struct {
66+
ExperimentRunDetails model.ExperimentRun `json:"getExperimentRun"`
67+
}
68+
5769
type ExperimentRunListData struct {
5870
Errors []struct {
5971
Message string `json:"message"`
@@ -66,14 +78,22 @@ type ExperimentRunsList struct {
6678
ListExperimentRunDetails model.ListExperimentRunResponse `json:"listExperimentRun"`
6779
}
6880

69-
type GetChaosExperimentRunGraphQLRequest struct {
81+
type GetChaosExperimentRunsGraphQLRequest struct {
7082
Query string `json:"query"`
7183
Variables struct {
7284
ProjectID string `json:"projectID"`
7385
GetChaosExperimentRunRequest model.ListExperimentRunRequest `json:"request"`
7486
} `json:"variables"`
7587
}
7688

89+
type GetChaosExperimentRunGraphQLRequest struct {
90+
Query string `json:"query"`
91+
Variables struct {
92+
ProjectID string `json:"projectID"`
93+
NotifyID string `json:"notifyID"`
94+
} `json:"variables"`
95+
}
96+
7797
type DeleteChaosExperimentData struct {
7898
Errors []struct {
7999
Message string `json:"message"`
@@ -94,3 +114,38 @@ type DeleteChaosExperimentGraphQLRequest struct {
94114
ExperimentRunID *string `json:"experimentRunID"`
95115
} `json:"variables"`
96116
}
117+
118+
type PodLogResponse struct {
119+
Log string `json:"log"`
120+
Typename string `json:"__typename"`
121+
}
122+
123+
type PodLogDetails struct {
124+
GetPodLog PodLogResponse `json:"getPodLog"`
125+
}
126+
127+
type PodLogData struct {
128+
Errors []struct {
129+
Message string `json:"message"`
130+
Path []string `json:"path"`
131+
} `json:"errors"`
132+
Data PodLogDetails `json:"data"`
133+
}
134+
135+
// Define the PodLogRequest structure
136+
type PodLogRequest struct {
137+
InfraID string `json:"infraID"`
138+
ExperimentRunID string `json:"experimentRunID"`
139+
PodName string `json:"podName"`
140+
PodNamespace string `json:"podNamespace"`
141+
PodType string `json:"podType"`
142+
RunnerPod string `json:"runnerPod"`
143+
ChaosNamespace string `json:"chaosNamespace"`
144+
}
145+
146+
type GetPodLogsGraphQLRequest struct {
147+
Query string `json:"query"`
148+
Variables struct {
149+
Request PodLogRequest `json:"request"`
150+
} `json:"variables"`
151+
}

0 commit comments

Comments
 (0)