Skip to content

Commit aeffc11

Browse files
authored
Merge pull request #25 from cryptosense/add-slot-name
Add slot name option
2 parents 0a15bf7 + e90163f commit aeffc11

4 files changed

Lines changed: 103 additions & 32 deletions

File tree

cs_api_cli/cs_api_cli.ml

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ let upload_trace
6161
~trace_name
6262
~project_id
6363
~project_name
64+
~slot_name
6465
~analyze
6566
~api =
6667
let open Lwt.Infix in
@@ -85,8 +86,8 @@ let upload_trace
8586
>>= (fun body ->
8687
let s3_key = Cs_api_core.parse_s3_response ~body in
8788
let import_request =
88-
Cs_api_core.build_trace_import_request ~api ~project_id ~s3_key
89-
~trace_name ~file
89+
Cs_api_core.build_trace_import_request ~slot_name ~api ~project_id
90+
~s3_key ~trace_name ~file
9091
in
9192
Lwt.return (Ok import_request))
9293
>>= Cs_api_io.send_request ~client
@@ -146,6 +147,13 @@ let project_id =
146147
in
147148
Cmdliner.Arg.(value & opt (some int) None & info ["p"; "project-id"] ~doc)
148149

150+
let slot_name =
151+
let doc =
152+
"Name of the slot the trace should be added to. If no slot with this name \
153+
exist in the chosen project then one will be created."
154+
in
155+
Cmdliner.Arg.(value & opt (some string) None & info ["slot-name"] ~doc)
156+
149157
let project_name =
150158
let doc =
151159
"Name of the project to which the trace should be added. Mutually \
@@ -218,12 +226,14 @@ let upload_trace_main
218226
trace_name
219227
project_id
220228
project_name
229+
slot_name
221230
analyze
222231
api_endpoint
223232
api_key
224233
ca_file
225234
no_check_certificate =
226-
upload_trace ~trace_file ~trace_name ~project_id ~project_name ~analyze
235+
upload_trace ~trace_file ~trace_name ~project_id ~project_name ~slot_name
236+
~analyze
227237
|> run_command ~ca_file ~no_check_certificate ~api_endpoint ~api_key
228238

229239
let analyze_trace_main
@@ -276,6 +286,7 @@ let upload_trace_term =
276286
$ trace_name
277287
$ project_id
278288
$ project_name
289+
$ slot_name
279290
$ analyze
280291
$ api_endpoint
281292
$ api_key

cs_api_core/cs_api_core.ml

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,24 @@ module Graphql = struct
1111
(Printf.sprintf "Invalid global ID prefix for type %s" type_)
1212
|> int_of_string
1313

14+
let generate_trace_upload_post =
15+
{|
16+
mutation GenerateTraceUploadPost {
17+
generateTraceUploadPost(input: {}) {
18+
url
19+
formData
20+
}
21+
}
22+
|}
23+
1424
let create_trace =
1525
{|
16-
mutation CreateTrace($projectId: ID!, $name: String!, $key: String!, $size: Int!) {
26+
mutation CreateTrace($projectId: ID!, $name: String!, $slotName: String, $key: String!, $size: Int!) {
1727
createTrace(
1828
input: {
1929
projectId: $projectId,
2030
name: $name,
31+
defaultSlotName: $slotName,
2132
key: $key,
2233
size: $size
2334
}
@@ -133,25 +144,22 @@ let parse_s3_signature_request ~body =
133144
let open CCOption.Infix in
134145
let open Yojson.Basic.Util in
135146
let json = Yojson.Basic.from_string body in
136-
let data = json |> member "data" in
147+
let data = json |> member "data" |> member "generateTraceUploadPost" in
137148
let url = data |> member "url" |> to_string_option in
138-
let signature =
139-
data |> member "fields" |> member "x-amz-signature" |> to_string_option
140-
in
141-
let credential =
142-
data |> member "fields" |> member "x-amz-credential" |> to_string_option
143-
in
144-
let algorithm =
145-
data |> member "fields" |> member "x-amz-algorithm" |> to_string_option
146-
in
147-
let date =
148-
data |> member "fields" |> member "x-amz-date" |> to_string_option
149+
let formData =
150+
match data |> member "formData" with
151+
| `String str -> Yojson.Basic.from_string str
152+
| _ -> `Null
149153
in
150-
let key = data |> member "fields" |> member "key" |> to_string_option in
151-
let policy = data |> member "fields" |> member "policy" |> to_string_option in
152-
let acl = data |> member "fields" |> member "acl" |> to_string_option in
154+
let signature = formData |> member "x-amz-signature" |> to_string_option in
155+
let credential = formData |> member "x-amz-credential" |> to_string_option in
156+
let algorithm = formData |> member "x-amz-algorithm" |> to_string_option in
157+
let date = formData |> member "x-amz-date" |> to_string_option in
158+
let key = formData |> member "key" |> to_string_option in
159+
let policy = formData |> member "policy" |> to_string_option in
160+
let acl = formData |> member "acl" |> to_string_option in
153161
let success_action_status =
154-
data |> member "fields" |> member "success_action_status" |> to_int_option
162+
formData |> member "success_action_status" |> to_int_option
155163
in
156164
url >>= fun url ->
157165
signature >>= fun signature ->
@@ -179,10 +187,15 @@ let parse_s3_response ~body =
179187

180188
let build_s3_signed_post_request ~api =
181189
let {Api.endpoint; key} = api in
182-
{ Api.Request.url = endpoint ^ "/api/v1/trace_s3_post"
183-
; header = [("API-KEY", key)]
190+
{ Api.Request.url = endpoint ^ "/api/v2"
191+
; header = [("API-KEY", key); ("Content-Type", "application/json")]
184192
; method_ = Post
185-
; data = Multipart [] }
193+
; data =
194+
Raw
195+
(Yojson.Safe.to_string
196+
(`Assoc
197+
[ ("query", `String Graphql.generate_trace_upload_post)
198+
; ("variables", `Assoc []) ])) }
186199

187200
let build_file_upload_request ~s3_url ~s3_signature ~(file : Api.File.t) =
188201
let direct_fields =
@@ -196,9 +209,20 @@ let build_file_upload_request ~s3_url ~s3_signature ~(file : Api.File.t) =
196209
; method_ = Post
197210
; data = Multipart (direct_fields @ [{name = "file"; content = File file}]) }
198211

199-
let build_trace_import_request ~api ~project_id ~s3_key ~trace_name ~file =
212+
let build_trace_import_request
213+
~api
214+
~project_id
215+
~slot_name
216+
~s3_key
217+
~trace_name
218+
~file =
200219
let {Api.endpoint; key} = api in
201220
let {Api.File.size; _} = file in
221+
let slot_name_var =
222+
match slot_name with
223+
| Some name -> `String name
224+
| None -> `Null
225+
in
202226
{ Api.Request.url = endpoint ^ "/api/v2"
203227
; header = [("API-KEY", key); ("Content-Type", "application/json")]
204228
; method_ = Post
@@ -209,7 +233,8 @@ let build_trace_import_request ~api ~project_id ~s3_key ~trace_name ~file =
209233
[ ("query", `String Graphql.create_trace)
210234
; ( "variables"
211235
, `Assoc
212-
[ ( "projectId"
236+
[ ("slotName", slot_name_var)
237+
; ( "projectId"
213238
, `String
214239
(Graphql.to_global_id ~type_:"Project" ~id:project_id)
215240
)

cs_api_core/cs_api_core.mli

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module Graphql : sig
22
val to_global_id : type_:string -> id:int -> string
33

4+
val generate_trace_upload_post : string
5+
46
val create_trace : string
57

68
val analyze_trace : string
@@ -35,6 +37,7 @@ val build_file_upload_request :
3537
val build_trace_import_request :
3638
api:Api.t
3739
-> project_id:int
40+
-> slot_name:string option
3841
-> s3_key:string
3942
-> trace_name:string
4043
-> file:Api.File.t

test/test.ml

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,16 @@ let request_builder_tests =
1515
let api = Api.make ~api_endpoint:"endpoint" ~api_key:"KEY" in
1616
[ test_request ~name:"S3 Signature request"
1717
~expected:
18-
{ Api.Request.url = "endpoint/api/v1/trace_s3_post"
19-
; header = [("API-KEY", "KEY")]
18+
{ Api.Request.url = "endpoint/api/v2"
19+
; header = [("API-KEY", "KEY"); ("Content-Type", "application/json")]
2020
; method_ = Post
21-
; data = Multipart [] }
21+
; data =
22+
Raw
23+
(Yojson.Safe.to_string
24+
(`Assoc
25+
[ ( "query"
26+
, `String Cs_api_core.Graphql.generate_trace_upload_post )
27+
; ("variables", `Assoc []) ])) }
2228
~actual:(Cs_api_core.build_s3_signed_post_request ~api)
2329
; test_request ~name:"File upload request"
2430
~expected:
@@ -38,7 +44,31 @@ let request_builder_tests =
3844
(Cs_api_core.build_file_upload_request ~s3_url:"url"
3945
~s3_signature:[("key", "abc"); ("signature", "cde")]
4046
~file:{path = "folder/path"; size = 10})
41-
; test_request ~name:"Trace import request"
47+
; test_request ~name:"Trace import request without slot name"
48+
~expected:
49+
{ url = "endpoint/api/v2"
50+
; header = [("API-KEY", "KEY"); ("Content-Type", "application/json")]
51+
; method_ = Post
52+
; data =
53+
Raw
54+
(Yojson.Safe.to_string
55+
(`Assoc
56+
[ ("query", `String Cs_api_core.Graphql.create_trace)
57+
; ( "variables"
58+
, `Assoc
59+
[ ("slotName", `Null)
60+
; ( "projectId"
61+
, `String
62+
(Cs_api_core.Graphql.to_global_id
63+
~type_:"Project" ~id:9) )
64+
; ("name", `String "cde")
65+
; ("key", `String "abc")
66+
; ("size", `Int 10) ] ) ])) }
67+
~actual:
68+
(Cs_api_core.build_trace_import_request ~api ~project_id:9
69+
~slot_name:None ~s3_key:"abc" ~trace_name:"cde"
70+
~file:{path = "path"; size = 10})
71+
; test_request ~name:"Trace import request with slot name"
4272
~expected:
4373
{ url = "endpoint/api/v2"
4474
; header = [("API-KEY", "KEY"); ("Content-Type", "application/json")]
@@ -50,16 +80,18 @@ let request_builder_tests =
5080
[ ("query", `String Cs_api_core.Graphql.create_trace)
5181
; ( "variables"
5282
, `Assoc
53-
[ ( "projectId"
83+
[ ("slotName", `String "name")
84+
; ( "projectId"
5485
, `String
5586
(Cs_api_core.Graphql.to_global_id
5687
~type_:"Project" ~id:9) )
5788
; ("name", `String "cde")
5889
; ("key", `String "abc")
5990
; ("size", `Int 10) ] ) ])) }
6091
~actual:
61-
(Cs_api_core.build_trace_import_request ~api ~project_id:9 ~s3_key:"abc"
62-
~trace_name:"cde" ~file:{path = "path"; size = 10})
92+
(Cs_api_core.build_trace_import_request ~api ~project_id:9
93+
~slot_name:(Some "name") ~s3_key:"abc" ~trace_name:"cde"
94+
~file:{path = "path"; size = 10})
6395
; test_request ~name:"Trace analysis request"
6496
~expected:
6597
{ url = "endpoint/api/v2"

0 commit comments

Comments
 (0)