Skip to content

Commit

Permalink
Add exitIfSucceed to multistep API tests (#2825)
Browse files Browse the repository at this point in the history
Co-authored-by: ci.datadog-api-spec <packages@datadoghq.com>
  • Loading branch information
api-clients-generation-pipeline[bot] and ci.datadog-api-spec authored Dec 9, 2024
1 parent 201efff commit 3c7c6aa
Show file tree
Hide file tree
Showing 56 changed files with 241 additions and 201 deletions.
8 changes: 4 additions & 4 deletions .apigentools-info
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
"spec_versions": {
"v1": {
"apigentools_version": "1.6.6",
"regenerated": "2024-12-05 20:22:39.701495",
"spec_repo_commit": "970515f9"
"regenerated": "2024-12-09 11:21:38.754852",
"spec_repo_commit": "21da0df3"
},
"v2": {
"apigentools_version": "1.6.6",
"regenerated": "2024-12-05 20:22:39.720628",
"spec_repo_commit": "970515f9"
"regenerated": "2024-12-09 11:21:38.773982",
"spec_repo_commit": "21da0df3"
}
}
}
3 changes: 3 additions & 0 deletions .generator/schemas/v1/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13741,6 +13741,9 @@ components:
items:
$ref: '#/components/schemas/SyntheticsAssertion'
type: array
exitIfSucceed:
description: Determines whether or not to exit the test if the step succeeds.
type: boolean
extractedValues:
description: Array of values to parse and save as variables from the response.
items:
Expand Down
37 changes: 36 additions & 1 deletion api/datadogV1/model_synthetics_api_test_step.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ type SyntheticsAPITestStep struct {
AllowFailure *bool `json:"allowFailure,omitempty"`
// Array of assertions used for the test.
Assertions []SyntheticsAssertion `json:"assertions"`
// Determines whether or not to exit the test if the step succeeds.
ExitIfSucceed *bool `json:"exitIfSucceed,omitempty"`
// Array of values to parse and save as variables from the response.
ExtractedValues []SyntheticsParsingOptions `json:"extractedValues,omitempty"`
// Determines whether or not to consider the entire test as failed if this step fails.
Expand Down Expand Up @@ -106,6 +108,34 @@ func (o *SyntheticsAPITestStep) SetAssertions(v []SyntheticsAssertion) {
o.Assertions = v
}

// GetExitIfSucceed returns the ExitIfSucceed field value if set, zero value otherwise.
func (o *SyntheticsAPITestStep) GetExitIfSucceed() bool {
if o == nil || o.ExitIfSucceed == nil {
var ret bool
return ret
}
return *o.ExitIfSucceed
}

// GetExitIfSucceedOk returns a tuple with the ExitIfSucceed field value if set, nil otherwise
// and a boolean to check if the value has been set.
func (o *SyntheticsAPITestStep) GetExitIfSucceedOk() (*bool, bool) {
if o == nil || o.ExitIfSucceed == nil {
return nil, false
}
return o.ExitIfSucceed, true
}

// HasExitIfSucceed returns a boolean if a field has been set.
func (o *SyntheticsAPITestStep) HasExitIfSucceed() bool {
return o != nil && o.ExitIfSucceed != nil
}

// SetExitIfSucceed gets a reference to the given bool and assigns it to the ExitIfSucceed field.
func (o *SyntheticsAPITestStep) SetExitIfSucceed(v bool) {
o.ExitIfSucceed = &v
}

// GetExtractedValues returns the ExtractedValues field value if set, zero value otherwise.
func (o *SyntheticsAPITestStep) GetExtractedValues() []SyntheticsParsingOptions {
if o == nil || o.ExtractedValues == nil {
Expand Down Expand Up @@ -269,6 +299,9 @@ func (o SyntheticsAPITestStep) MarshalJSON() ([]byte, error) {
toSerialize["allowFailure"] = o.AllowFailure
}
toSerialize["assertions"] = o.Assertions
if o.ExitIfSucceed != nil {
toSerialize["exitIfSucceed"] = o.ExitIfSucceed
}
if o.ExtractedValues != nil {
toSerialize["extractedValues"] = o.ExtractedValues
}
Expand All @@ -293,6 +326,7 @@ func (o *SyntheticsAPITestStep) UnmarshalJSON(bytes []byte) (err error) {
all := struct {
AllowFailure *bool `json:"allowFailure,omitempty"`
Assertions *[]SyntheticsAssertion `json:"assertions"`
ExitIfSucceed *bool `json:"exitIfSucceed,omitempty"`
ExtractedValues []SyntheticsParsingOptions `json:"extractedValues,omitempty"`
IsCritical *bool `json:"isCritical,omitempty"`
Name *string `json:"name"`
Expand All @@ -317,14 +351,15 @@ func (o *SyntheticsAPITestStep) UnmarshalJSON(bytes []byte) (err error) {
}
additionalProperties := make(map[string]interface{})
if err = datadog.Unmarshal(bytes, &additionalProperties); err == nil {
datadog.DeleteKeys(additionalProperties, &[]string{"allowFailure", "assertions", "extractedValues", "isCritical", "name", "request", "retry", "subtype"})
datadog.DeleteKeys(additionalProperties, &[]string{"allowFailure", "assertions", "exitIfSucceed", "extractedValues", "isCritical", "name", "request", "retry", "subtype"})
} else {
return err
}

hasInvalidField := false
o.AllowFailure = all.AllowFailure
o.Assertions = *all.Assertions
o.ExitIfSucceed = all.ExitIfSucceed
o.ExtractedValues = all.ExtractedValues
o.IsCritical = all.IsCritical
o.Name = *all.Name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ func main() {
Target: 200,
}},
},
ExitIfSucceed: datadog.PtrBool(true),
ExtractedValues: []datadogV1.SyntheticsParsingOptions{
{
Field: datadog.PtrString("server"),
Expand Down
12 changes: 7 additions & 5 deletions examples/v1/synthetics/CreateSyntheticsBrowserTest.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,11 +70,13 @@ func main() {
Type: datadogV1.SYNTHETICSBROWSERTESTTYPE_BROWSER,
Steps: []datadogV1.SyntheticsStep{
{
AllowFailure: datadog.PtrBool(false),
IsCritical: datadog.PtrBool(true),
Name: datadog.PtrString("Refresh page"),
Params: new(interface{}),
Type: datadogV1.SYNTHETICSSTEPTYPE_REFRESH.Ptr(),
AllowFailure: datadog.PtrBool(false),
AlwaysExecute: datadog.PtrBool(true),
ExitIfSucceed: datadog.PtrBool(true),
IsCritical: datadog.PtrBool(true),
Name: datadog.PtrString("Refresh page"),
Params: new(interface{}),
Type: datadogV1.SYNTHETICSSTEPTYPE_REFRESH.Ptr(),
},
},
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2024-09-10T20:52:06.237Z
2024-12-09T11:17:37.828Z
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
interactions:
- request:
body: |
{"config":{"configVariables":[{"example":"content-type","name":"PROPERTY","pattern":"content-type","type":"text"}],"steps":[{"allowFailure":true,"assertions":[{"operator":"is","target":200,"type":"statusCode"}],"extractedValues":[{"field":"server","name":"EXTRACTED_VALUE","parser":{"type":"raw"},"secure":true,"type":"http_header"}],"isCritical":true,"name":"request is sent","request":{"httpVersion":"http2","method":"GET","timeout":10,"url":"https://datadoghq.com"},"retry":{"count":5,"interval":1000},"subtype":"http"},{"name":"Wait","subtype":"wait","value":1},{"allowFailure":false,"assertions":[{"operator":"lessThan","target":1000,"type":"responseTime"}],"extractedValues":[],"isCritical":true,"name":"GRPC CALL","request":{"callType":"unary","compressedJsonDescriptor":"eJy1lU1z2yAQhv+Lzj74I3ETH506bQ7OZOSm1w4Wa4epBARQppqM/3v5koCJJdvtxCdW77vPssCO3zMKUgHOFu/ZXvBiS6hZho/f8qe7pftYgXphWJrlA8XwxywEvNba+6PhkC2yVcVVswYp0R6ykRYlZ1SCV21SDrxsssPIeS9FJKqGfK2rqnmmSBwhWa2XlKgtaQPiDcRGCUDVfwGD2sKUqKEtc1cSoOrsMlaMOec1sySYCCgUYRSVLv2zSva2u+FQkB0pVkIw8bFuIudOOn3pOaKYVT3Iy97Pd0AYhOx5QcMsnxvRHlnuLf8ETDd3CNtrv2nejkDpRnANCmGkkFn/hsYzpBKE7jVbufgnKnV9HRM9zRPDDKPttYT61n0TdWkAAjggk9AhuxIeaXd69CYTcsGw7cBTakLVbNpRzGEgyWjkSOpMbZXkhGL6oX30R49qt3GoHrap7i0XdD41WQ+2icCNm5p1hmFqnHNlcla0riKmDZ183crDxChjbnurtxHPRE784sVhWvDfGP+SsTKibU3o5NtWHuZFGZOxP6P5VXqIOvaOSec4eYohyd7NslHuJbd1bewds85xYrNxkr2d+5IhFWF3NvaO684xjE2S5ulY+tu64Pna0fCPJgzw6vF5/WucLcYjt5xoq19O3UDptOg/OamJQRaCcPPnMTQ2QDFn+uhPvUfnCrMc99upyQY4Ui9Dlc/YoG3R/v4Cs9YE+g==","host":"grpcbin.test.k6.io","message":"{}","metadata":{},"method":"Index","port":9000,"service":"grpcbin.GRPCBin"},"retry":{"count":0,"interval":300},"subtype":"grpc"}]},"locations":["aws:us-east-2"],"message":"BDD test payload: synthetics_api_test_multi_step_payload.json","name":"Test-Create_a_FIDO_global_variable_returns_OK_response-1726001526","options":{"accept_self_signed":false,"allow_insecure":true,"follow_redirects":true,"min_failure_duration":10,"min_location_failed":1,"monitor_name":"Test-Create_a_FIDO_global_variable_returns_OK_response-1726001526","monitor_priority":5,"retry":{"count":3,"interval":1000},"tick_every":60},"subtype":"multi","tags":["testing:api"],"type":"api"}
{"config":{"configVariables":[{"example":"content-type","name":"PROPERTY","pattern":"content-type","type":"text"}],"steps":[{"allowFailure":true,"assertions":[{"operator":"is","target":200,"type":"statusCode"}],"exitIfSucceed":true,"extractedValues":[{"field":"server","name":"EXTRACTED_VALUE","parser":{"type":"raw"},"secure":true,"type":"http_header"}],"isCritical":true,"name":"request is sent","request":{"httpVersion":"http2","method":"GET","timeout":10,"url":"https://datadoghq.com"},"retry":{"count":5,"interval":1000},"subtype":"http"},{"name":"Wait","subtype":"wait","value":1},{"allowFailure":false,"assertions":[{"operator":"lessThan","target":1000,"type":"responseTime"}],"extractedValues":[],"isCritical":true,"name":"GRPC CALL","request":{"callType":"unary","compressedJsonDescriptor":"eJy1lU1z2yAQhv+Lzj74I3ETH506bQ7OZOSm1w4Wa4epBARQppqM/3v5koCJJdvtxCdW77vPssCO3zMKUgHOFu/ZXvBiS6hZho/f8qe7pftYgXphWJrlA8XwxywEvNba+6PhkC2yVcVVswYp0R6ykRYlZ1SCV21SDrxsssPIeS9FJKqGfK2rqnmmSBwhWa2XlKgtaQPiDcRGCUDVfwGD2sKUqKEtc1cSoOrsMlaMOec1sySYCCgUYRSVLv2zSva2u+FQkB0pVkIw8bFuIudOOn3pOaKYVT3Iy97Pd0AYhOx5QcMsnxvRHlnuLf8ETDd3CNtrv2nejkDpRnANCmGkkFn/hsYzpBKE7jVbufgnKnV9HRM9zRPDDKPttYT61n0TdWkAAjggk9AhuxIeaXd69CYTcsGw7cBTakLVbNpRzGEgyWjkSOpMbZXkhGL6oX30R49qt3GoHrap7i0XdD41WQ+2icCNm5p1hmFqnHNlcla0riKmDZ183crDxChjbnurtxHPRE784sVhWvDfGP+SsTKibU3o5NtWHuZFGZOxP6P5VXqIOvaOSec4eYohyd7NslHuJbd1bewds85xYrNxkr2d+5IhFWF3NvaO684xjE2S5ulY+tu64Pna0fCPJgzw6vF5/WucLcYjt5xoq19O3UDptOg/OamJQRaCcPPnMTQ2QDFn+uhPvUfnCrMc99upyQY4Ui9Dlc/YoG3R/v4Cs9YE+g==","host":"grpcbin.test.k6.io","message":"{}","metadata":{},"method":"Index","port":9000,"service":"grpcbin.GRPCBin"},"retry":{"count":0,"interval":300},"subtype":"grpc"}]},"locations":["aws:us-east-2"],"message":"BDD test payload: synthetics_api_test_multi_step_payload.json","name":"Test-Create_a_FIDO_global_variable_returns_OK_response-1733743057","options":{"accept_self_signed":false,"allow_insecure":true,"follow_redirects":true,"min_failure_duration":10,"min_location_failed":1,"monitor_name":"Test-Create_a_FIDO_global_variable_returns_OK_response-1733743057","monitor_priority":5,"retry":{"count":3,"interval":1000},"tick_every":60},"subtype":"multi","tags":["testing:api"],"type":"api"}
form: {}
headers:
Accept:
Expand All @@ -12,12 +12,10 @@ interactions:
method: POST
url: https://api.datadoghq.com/api/v1/synthetics/tests/api
response:
body: '{"public_id":"p6b-hvg-d5g","name":"Test-Create_a_FIDO_global_variable_returns_OK_response-1726001526","status":"live","type":"api","tags":["testing:api"],"created_at":"2024-09-10T20:52:06.807594+00:00","modified_at":"2024-09-10T20:52:06.807594+00:00","config":{"configVariables":[{"example":"content-type","name":"PROPERTY","pattern":"content-type","type":"text"}],"steps":[{"allowFailure":true,"assertions":[{"operator":"is","target":200,"type":"statusCode"}],"extractedValues":[{"field":"server","name":"EXTRACTED_VALUE","parser":{"type":"raw"},"secure":true,"type":"http_header"}],"isCritical":true,"name":"request
is sent","request":{"httpVersion":"http2","method":"GET","timeout":10,"url":"https://datadoghq.com"},"retry":{"count":5,"interval":1000},"subtype":"http","id":"9pq-dfu-4tx"},{"name":"Wait","subtype":"wait","value":1,"id":"5zh-heq-fy6"},{"allowFailure":false,"assertions":[{"operator":"lessThan","target":1000,"type":"responseTime"}],"extractedValues":[],"isCritical":true,"name":"GRPC
CALL","request":{"callType":"unary","compressedJsonDescriptor":"eJy1lU1z2yAQhv+Lzj74I3ETH506bQ7OZOSm1w4Wa4epBARQppqM/3v5koCJJdvtxCdW77vPssCO3zMKUgHOFu/ZXvBiS6hZho/f8qe7pftYgXphWJrlA8XwxywEvNba+6PhkC2yVcVVswYp0R6ykRYlZ1SCV21SDrxsssPIeS9FJKqGfK2rqnmmSBwhWa2XlKgtaQPiDcRGCUDVfwGD2sKUqKEtc1cSoOrsMlaMOec1sySYCCgUYRSVLv2zSva2u+FQkB0pVkIw8bFuIudOOn3pOaKYVT3Iy97Pd0AYhOx5QcMsnxvRHlnuLf8ETDd3CNtrv2nejkDpRnANCmGkkFn/hsYzpBKE7jVbufgnKnV9HRM9zRPDDKPttYT61n0TdWkAAjggk9AhuxIeaXd69CYTcsGw7cBTakLVbNpRzGEgyWjkSOpMbZXkhGL6oX30R49qt3GoHrap7i0XdD41WQ+2icCNm5p1hmFqnHNlcla0riKmDZ183crDxChjbnurtxHPRE784sVhWvDfGP+SsTKibU3o5NtWHuZFGZOxP6P5VXqIOvaOSec4eYohyd7NslHuJbd1bewds85xYrNxkr2d+5IhFWF3NvaO684xjE2S5ulY+tu64Pna0fCPJgzw6vF5/WucLcYjt5xoq19O3UDptOg/OamJQRaCcPPnMTQ2QDFn+uhPvUfnCrMc99upyQY4Ui9Dlc/YoG3R/v4Cs9YE+g==","host":"grpcbin.test.k6.io","message":"{}","metadata":{},"method":"Index","port":9000,"service":"grpcbin.GRPCBin"},"retry":{"count":0,"interval":300},"subtype":"grpc","id":"yym-8ty-zfz"}]},"message":"BDD
test payload: synthetics_api_test_multi_step_payload.json","options":{"accept_self_signed":false,"allow_insecure":true,"follow_redirects":true,"min_failure_duration":10,"min_location_failed":1,"monitor_name":"Test-Create_a_FIDO_global_variable_returns_OK_response-1726001526","monitor_priority":5,"retry":{"count":3,"interval":1000},"tick_every":60},"locations":["aws:us-east-2"],"subtype":"multi","created_by":{"name":"CI
Account","handle":"9919ec9b-ebc7-49ee-8dc8-03626e717cca","email":"team-intg-tools-libs-spam@datadoghq.com"},"deleted_at":null,"monitor_id":153521795,"org_id":321813,"modified_by":{"name":"CI
Account","handle":"9919ec9b-ebc7-49ee-8dc8-03626e717cca","email":"team-intg-tools-libs-spam@datadoghq.com"}}'
body: '{"public_id":"2ym-xig-di5","name":"Test-Create_a_FIDO_global_variable_returns_OK_response-1733743057","status":"live","type":"api","subtype":"multi","tags":["testing:api"],"created_at":"2024-12-09T11:17:38.620924+00:00","modified_at":"2024-12-09T11:17:38.620924+00:00","config":{"configVariables":[{"example":"content-type","name":"PROPERTY","pattern":"content-type","type":"text"}],"steps":[{"allowFailure":true,"assertions":[{"operator":"is","target":200,"type":"statusCode"}],"exitIfSucceed":true,"extractedValues":[{"field":"server","name":"EXTRACTED_VALUE","parser":{"type":"raw"},"secure":true,"type":"http_header"}],"isCritical":true,"name":"request
is sent","request":{"httpVersion":"http2","method":"GET","timeout":10,"url":"https://datadoghq.com"},"retry":{"count":5,"interval":1000},"subtype":"http","id":"669-hdh-vh3"},{"name":"Wait","subtype":"wait","value":1,"id":"hkh-v6r-ddp"},{"allowFailure":false,"assertions":[{"operator":"lessThan","target":1000,"type":"responseTime"}],"extractedValues":[],"isCritical":true,"name":"GRPC
CALL","request":{"callType":"unary","compressedJsonDescriptor":"eJy1lU1z2yAQhv+Lzj74I3ETH506bQ7OZOSm1w4Wa4epBARQppqM/3v5koCJJdvtxCdW77vPssCO3zMKUgHOFu/ZXvBiS6hZho/f8qe7pftYgXphWJrlA8XwxywEvNba+6PhkC2yVcVVswYp0R6ykRYlZ1SCV21SDrxsssPIeS9FJKqGfK2rqnmmSBwhWa2XlKgtaQPiDcRGCUDVfwGD2sKUqKEtc1cSoOrsMlaMOec1sySYCCgUYRSVLv2zSva2u+FQkB0pVkIw8bFuIudOOn3pOaKYVT3Iy97Pd0AYhOx5QcMsnxvRHlnuLf8ETDd3CNtrv2nejkDpRnANCmGkkFn/hsYzpBKE7jVbufgnKnV9HRM9zRPDDKPttYT61n0TdWkAAjggk9AhuxIeaXd69CYTcsGw7cBTakLVbNpRzGEgyWjkSOpMbZXkhGL6oX30R49qt3GoHrap7i0XdD41WQ+2icCNm5p1hmFqnHNlcla0riKmDZ183crDxChjbnurtxHPRE784sVhWvDfGP+SsTKibU3o5NtWHuZFGZOxP6P5VXqIOvaOSec4eYohyd7NslHuJbd1bewds85xYrNxkr2d+5IhFWF3NvaO684xjE2S5ulY+tu64Pna0fCPJgzw6vF5/WucLcYjt5xoq19O3UDptOg/OamJQRaCcPPnMTQ2QDFn+uhPvUfnCrMc99upyQY4Ui9Dlc/YoG3R/v4Cs9YE+g==","host":"grpcbin.test.k6.io","message":"{}","metadata":{},"method":"Index","port":9000,"service":"grpcbin.GRPCBin"},"retry":{"count":0,"interval":300},"subtype":"grpc","id":"6w8-xwm-qki"}]},"message":"BDD
test payload: synthetics_api_test_multi_step_payload.json","options":{"accept_self_signed":false,"allow_insecure":true,"follow_redirects":true,"min_failure_duration":10,"min_location_failed":1,"monitor_name":"Test-Create_a_FIDO_global_variable_returns_OK_response-1733743057","monitor_priority":5,"retry":{"count":3,"interval":1000},"tick_every":60},"locations":["aws:us-east-2"],"created_by":{"name":null,"handle":"frog@datadoghq.com","email":"frog@datadoghq.com"},"deleted_at":null,"monitor_id":159880989,"org_id":321813,"modified_by":{"name":null,"handle":"frog@datadoghq.com","email":"frog@datadoghq.com"}}'
code: 200
duration: 0ms
headers:
Expand All @@ -26,7 +24,7 @@ interactions:
status: 200 OK
- request:
body: |
{"description":"","is_fido":true,"name":"GLOBAL_VARIABLE_FIDO_PAYLOAD_TESTCREATEAFIDOGLOBALVARIABLERETURNSOKRESPONSE1726001526","tags":[]}
{"description":"","is_fido":true,"name":"GLOBAL_VARIABLE_FIDO_PAYLOAD_TESTCREATEAFIDOGLOBALVARIABLERETURNSOKRESPONSE1733743057","tags":[]}
form: {}
headers:
Accept:
Expand All @@ -37,7 +35,7 @@ interactions:
method: POST
url: https://api.datadoghq.com/api/v1/synthetics/variables
response:
body: '{"id":"444f9cc5-e73a-48f5-abf5-da526ad46a56","name":"GLOBAL_VARIABLE_FIDO_PAYLOAD_TESTCREATEAFIDOGLOBALVARIABLERETURNSOKRESPONSE1726001526","description":"","type":"variable","tags":[],"last_error":null,"is_fido":true,"value":{"secure":true}}
body: '{"id":"7e732043-f247-41d4-adff-ccf1624107b7","name":"GLOBAL_VARIABLE_FIDO_PAYLOAD_TESTCREATEAFIDOGLOBALVARIABLERETURNSOKRESPONSE1733743057","description":"","type":"variable","tags":[],"last_error":null,"is_fido":true,"value":{"secure":true}}
'
code: 200
Expand All @@ -54,7 +52,7 @@ interactions:
- '*/*'
id: 2
method: DELETE
url: https://api.datadoghq.com/api/v1/synthetics/variables/444f9cc5-e73a-48f5-abf5-da526ad46a56
url: https://api.datadoghq.com/api/v1/synthetics/variables/7e732043-f247-41d4-adff-ccf1624107b7
response:
body: ''
code: 200
Expand All @@ -65,7 +63,7 @@ interactions:
status: 200 OK
- request:
body: |
{"public_ids":["p6b-hvg-d5g"]}
{"public_ids":["2ym-xig-di5"]}
form: {}
headers:
Accept:
Expand All @@ -76,7 +74,7 @@ interactions:
method: POST
url: https://api.datadoghq.com/api/v1/synthetics/tests/delete
response:
body: '{"deleted_tests":[{"public_id":"p6b-hvg-d5g","deleted_at":"2024-09-10T20:52:08.499085+00:00"}]}
body: '{"deleted_tests":[{"public_id":"2ym-xig-di5","deleted_at":"2024-12-09T11:17:40.588357+00:00"}]}
'
code: 200
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2024-09-10T20:52:08.676Z
2024-12-09T11:17:40.840Z
Loading

0 comments on commit 3c7c6aa

Please sign in to comment.