Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Separate out string key and string value condition messages for label application rules #198

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
LabelApplicationRuleData data = 2;
}

message LabelApplicationRuleData {

Check failure on line 12 in label-application-rule-config-service-api/src/main/proto/org/hypertrace/label/application/rule/config/service/v1/label_application_rule.proto

View workflow job for this annotation

GitHub Actions / validate-protos

Previously present enum "LabelApplicationRuleData.StringCondition.Operator" was deleted from package "org.hypertrace.label.application.rule.config.service.v1".

Check failure on line 12 in label-application-rule-config-service-api/src/main/proto/org/hypertrace/label/application/rule/config/service/v1/label_application_rule.proto

View workflow job for this annotation

GitHub Actions / validate-protos

Previously present message "LabelApplicationRuleData.StringCondition" was deleted from package "org.hypertrace.label.application.rule.config.service.v1".

Check failure on line 12 in label-application-rule-config-service-api/src/main/proto/org/hypertrace/label/application/rule/config/service/v1/label_application_rule.proto

View workflow job for this annotation

GitHub Actions / validate-protos

Previously present message "LabelApplicationRuleData.StringCondition.StringList" was deleted from package "org.hypertrace.label.application.rule.config.service.v1".
string name = 1;
Condition matching_condition = 2;
Action label_action = 3;
Expand All @@ -36,15 +36,28 @@

message LeafCondition {
// only equals and regex are supported for key condition
StringCondition key_condition = 1;
StringKeyCondition key_condition = 1;

Check failure on line 39 in label-application-rule-config-service-api/src/main/proto/org/hypertrace/label/application/rule/config/service/v1/label_application_rule.proto

View workflow job for this annotation

GitHub Actions / validate-protos

Field "1" on message "LeafCondition" changed type from "org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringCondition" to "org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringKeyCondition".

Check failure on line 39 in label-application-rule-config-service-api/src/main/proto/org/hypertrace/label/application/rule/config/service/v1/label_application_rule.proto

View workflow job for this annotation

GitHub Actions / validate-protos

Field "1" on message "LeafCondition" changed type from "org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringCondition" to "org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringKeyCondition".
oneof condition {
StringCondition string_condition = 2;
StringValueCondition string_condition = 2;

Check failure on line 41 in label-application-rule-config-service-api/src/main/proto/org/hypertrace/label/application/rule/config/service/v1/label_application_rule.proto

View workflow job for this annotation

GitHub Actions / validate-protos

Field "2" on message "LeafCondition" changed type from "org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringCondition" to "org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringValueCondition".

Check failure on line 41 in label-application-rule-config-service-api/src/main/proto/org/hypertrace/label/application/rule/config/service/v1/label_application_rule.proto

View workflow job for this annotation

GitHub Actions / validate-protos

Field "2" on message "LeafCondition" changed type from "org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringCondition" to "org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringValueCondition".
UnaryCondition unary_condition = 3;
JsonCondition json_condition = 4;
}
}

message StringCondition {
message StringKeyCondition {
Operator operator = 1;
oneof kind {
string value = 2;
}

enum Operator {
OPERATOR_UNSPECIFIED = 0;
OPERATOR_EQUALS = 1; // operator to check if the key exists, and value is equal to the provided value
OPERATOR_MATCHES_REGEX = 2; // operator to check if the key exists, and value matches the provided regex value
}
}

message StringValueCondition {
Operator operator = 1;
oneof kind {
string value = 2;
Expand Down Expand Up @@ -79,7 +92,7 @@
message JsonCondition {
string json_path = 1; // path to json structure
oneof value_condition {
StringCondition string_condition = 2;
StringValueCondition string_condition = 2;

Check failure on line 95 in label-application-rule-config-service-api/src/main/proto/org/hypertrace/label/application/rule/config/service/v1/label_application_rule.proto

View workflow job for this annotation

GitHub Actions / validate-protos

Field "2" on message "JsonCondition" changed type from "org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringCondition" to "org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringValueCondition".

Check failure on line 95 in label-application-rule-config-service-api/src/main/proto/org/hypertrace/label/application/rule/config/service/v1/label_application_rule.proto

View workflow job for this annotation

GitHub Actions / validate-protos

Field "2" on message "JsonCondition" changed type from "org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringCondition" to "org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringValueCondition".
UnaryCondition unary_condition = 3;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,15 @@
import org.hypertrace.label.application.rule.config.service.v1.GetLabelApplicationRulesRequest;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.Action;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.Action.DynamicLabel;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.Action.DynamicLabel.TokenExtractionRule;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.Action.StaticLabels;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.CompositeCondition;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.Condition;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.JsonCondition;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.LeafCondition;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringCondition;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringKeyCondition;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringValueCondition;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.UnaryCondition;
import org.hypertrace.label.application.rule.config.service.v1.UpdateLabelApplicationRuleRequest;

Expand Down Expand Up @@ -60,12 +65,12 @@

private void validateLabelApplicationRuleData(LabelApplicationRuleData labelApplicationRuleData) {
validateNonDefaultPresenceOrThrow(
labelApplicationRuleData, labelApplicationRuleData.NAME_FIELD_NUMBER);
labelApplicationRuleData, LabelApplicationRuleData.NAME_FIELD_NUMBER);
validateCondition(labelApplicationRuleData.getMatchingCondition());
validateAction(labelApplicationRuleData.getLabelAction());
}

private void validateCondition(LabelApplicationRuleData.Condition condition) {
private void validateCondition(Condition condition) {
switch (condition.getConditionCase()) {
case LEAF_CONDITION:
validateLeafCondition(condition.getLeafCondition());
Expand All @@ -84,7 +89,7 @@
validateKeyStringCondition(leafCondition.getKeyCondition());
switch (leafCondition.getConditionCase()) {
case STRING_CONDITION:
validateStringCondition(leafCondition.getStringCondition());
validateStringValueCondition(leafCondition.getStringCondition());
break;
case UNARY_CONDITION:
validateUnaryCondition(leafCondition.getUnaryCondition());
Expand All @@ -101,15 +106,15 @@
}

private void validateCompositeCondition(CompositeCondition compositeCondition) {
validateNonDefaultPresenceOrThrow(compositeCondition, compositeCondition.OPERATOR_FIELD_NUMBER);
validateNonDefaultPresenceOrThrow(compositeCondition, CompositeCondition.OPERATOR_FIELD_NUMBER);
compositeCondition.getChildrenList().forEach(this::validateCondition);
}

private void validateJsonCondition(JsonCondition jsonCondition) {
validateNonDefaultPresenceOrThrow(jsonCondition, jsonCondition.JSON_PATH_FIELD_NUMBER);
validateNonDefaultPresenceOrThrow(jsonCondition, JsonCondition.JSON_PATH_FIELD_NUMBER);
switch (jsonCondition.getValueConditionCase()) {
case STRING_CONDITION:
validateStringCondition(jsonCondition.getStringCondition());
validateStringValueCondition(jsonCondition.getStringCondition());
break;
case UNARY_CONDITION:
validateUnaryCondition(jsonCondition.getUnaryCondition());
Expand All @@ -122,8 +127,8 @@
}
}

private void validateKeyStringCondition(StringCondition stringCondition) {
validateNonDefaultPresenceOrThrow(stringCondition, StringCondition.VALUE_FIELD_NUMBER);
private void validateKeyStringCondition(StringKeyCondition stringCondition) {
validateNonDefaultPresenceOrThrow(stringCondition, StringKeyCondition.VALUE_FIELD_NUMBER);
switch (stringCondition.getOperator()) {
case OPERATOR_EQUALS:
break;
Expand All @@ -147,12 +152,12 @@
}
}

private void validateStringCondition(StringCondition stringCondition) {
validateNonDefaultPresenceOrThrow(stringCondition, StringCondition.OPERATOR_FIELD_NUMBER);
private void validateStringValueCondition(StringValueCondition stringCondition) {
validateNonDefaultPresenceOrThrow(stringCondition, StringValueCondition.OPERATOR_FIELD_NUMBER);
switch (stringCondition.getOperator()) {
case OPERATOR_MATCHES_REGEX:
case OPERATOR_NOT_MATCHES_REGEX:
validateNonDefaultPresenceOrThrow(stringCondition, StringCondition.VALUE_FIELD_NUMBER);
validateNonDefaultPresenceOrThrow(stringCondition, StringValueCondition.VALUE_FIELD_NUMBER);
final String pattern = stringCondition.getValue();
final Status regexValidationStatus = RegexValidator.validate(pattern);
if (!regexValidationStatus.isOk()) {
Expand Down Expand Up @@ -192,13 +197,13 @@
}

private void validateUnaryCondition(UnaryCondition unaryCondition) {
validateNonDefaultPresenceOrThrow(unaryCondition, unaryCondition.OPERATOR_FIELD_NUMBER);
validateNonDefaultPresenceOrThrow(unaryCondition, UnaryCondition.OPERATOR_FIELD_NUMBER);
}

private void validateAction(Action action) {
validateNonDefaultPresenceOrThrow(action, action.ENTITY_TYPES_FIELD_NUMBER);
validateNonDefaultPresenceOrThrow(action, Action.ENTITY_TYPES_FIELD_NUMBER);
validateEntityTypes(action.getEntityTypesList());
validateNonDefaultPresenceOrThrow(action, action.OPERATION_FIELD_NUMBER);
validateNonDefaultPresenceOrThrow(action, Action.OPERATION_FIELD_NUMBER);
switch (action.getValueCase()) {
case STATIC_LABELS:
validateStaticLabels(action.getStaticLabels());
Expand All @@ -207,7 +212,7 @@
validateDynamicLabel(action.getDynamicLabelExpression());
break;
case DYNAMIC_LABEL_KEY:
validateNonDefaultPresenceOrThrow(action, action.DYNAMIC_LABEL_KEY_FIELD_NUMBER);
validateNonDefaultPresenceOrThrow(action, Action.DYNAMIC_LABEL_KEY_FIELD_NUMBER);
break;
default:
throwInvalidArgumentException(
Expand All @@ -221,22 +226,22 @@
}
}

void validateStaticLabels(Action.StaticLabels staticLabels) {
validateNonDefaultPresenceOrThrow(staticLabels, staticLabels.IDS_FIELD_NUMBER);
void validateStaticLabels(StaticLabels staticLabels) {
validateNonDefaultPresenceOrThrow(staticLabels, StaticLabels.IDS_FIELD_NUMBER);

Check warning on line 230 in label-application-rule-config-service-impl/src/main/java/org/hypertrace/label/application/rule/config/service/LabelApplicationRuleValidatorImpl.java

View check run for this annotation

Codecov / codecov/patch

label-application-rule-config-service-impl/src/main/java/org/hypertrace/label/application/rule/config/service/LabelApplicationRuleValidatorImpl.java#L230

Added line #L230 was not covered by tests
List<String> staticLabelIds = staticLabels.getIdsList();
if (Set.copyOf(staticLabelIds).size() != staticLabelIds.size()) {
throwInvalidArgumentException(
String.format("Duplicate Static Labels %s", printMessage(staticLabels)));
}
}

private void validateDynamicLabel(Action.DynamicLabel dynamicLabel) {
validateNonDefaultPresenceOrThrow(dynamicLabel, dynamicLabel.LABEL_EXPRESSION_FIELD_NUMBER);
private void validateDynamicLabel(DynamicLabel dynamicLabel) {
validateNonDefaultPresenceOrThrow(dynamicLabel, DynamicLabel.LABEL_EXPRESSION_FIELD_NUMBER);
validateLabelExpression(dynamicLabel);
dynamicLabel.getTokenExtractionRulesList().forEach(this::validateTokenExtractionRule);
}

public void validateLabelExpression(Action.DynamicLabel dynamicLabel) {
public void validateLabelExpression(DynamicLabel dynamicLabel) {
String labelExpression = dynamicLabel.getLabelExpression();
List<String> validKeys = new ArrayList<>();
dynamicLabel
Expand All @@ -261,9 +266,8 @@
}
}

private void validateTokenExtractionRule(
Action.DynamicLabel.TokenExtractionRule tokenExtractionRule) {
validateNonDefaultPresenceOrThrow(tokenExtractionRule, tokenExtractionRule.KEY_FIELD_NUMBER);
private void validateTokenExtractionRule(TokenExtractionRule tokenExtractionRule) {
validateNonDefaultPresenceOrThrow(tokenExtractionRule, TokenExtractionRule.KEY_FIELD_NUMBER);
}

private void throwInvalidArgumentException(String description) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import io.grpc.Status;
import io.grpc.StatusRuntimeException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
Expand All @@ -35,7 +34,8 @@
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.Condition;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.JsonCondition;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.LeafCondition;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringCondition;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringKeyCondition;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.StringValueCondition;
import org.hypertrace.label.application.rule.config.service.v1.LabelApplicationRuleData.UnaryCondition;
import org.hypertrace.label.application.rule.config.service.v1.UpdateLabelApplicationRuleRequest;
import org.hypertrace.label.application.rule.config.service.v1.UpdateLabelApplicationRuleResponse;
Expand Down Expand Up @@ -73,7 +73,7 @@ void afterEach() {

@Test
void createLabelApplicationRule() {
LabelApplicationRule simpleRule = createSimpleRule("auth", "valid");
LabelApplicationRule simpleRule = createSimpleRule();
LabelApplicationRule compositeRule = createCompositeRule();
List<LabelApplicationRule> createdRules = List.of(simpleRule, compositeRule);
List<LabelApplicationRuleData> createdData =
Expand Down Expand Up @@ -107,7 +107,7 @@ void createLabelApplicationRuleWithDynamicLabelApplicationRulesLimitReached() {

@Test
void getLabelApplicationRules() {
LabelApplicationRule simpleRule = createSimpleRule("auth", "valid");
LabelApplicationRule simpleRule = createSimpleRule();
LabelApplicationRule compositeRule = createCompositeRule();
Set<LabelApplicationRule> expectedRules = Set.of(simpleRule, compositeRule);
GetLabelApplicationRulesResponse response =
Expand All @@ -120,7 +120,7 @@ void getLabelApplicationRules() {

@Test
void updateLabelApplicationRule() {
LabelApplicationRule simpleRule = createSimpleRule("auth", "valid");
LabelApplicationRule simpleRule = createSimpleRule();
LabelApplicationRuleData expectedData = buildSimpleRuleData("auth", "not-valid");
String updateRuleId = simpleRule.getId();
UpdateLabelApplicationRuleRequest request =
Expand All @@ -135,22 +135,20 @@ void updateLabelApplicationRule() {

@Test
void updateLabelApplicationRuleError() {
LabelApplicationRule simpleRule = createSimpleRule("auth", "valid");
LabelApplicationRuleData expectedData = buildSimpleRuleData("auth", "not-valid");
UpdateLabelApplicationRuleRequest request =
UpdateLabelApplicationRuleRequest.newBuilder().setId("1").setData(expectedData).build();
Throwable exception =
assertThrows(
StatusRuntimeException.class,
() -> {
labelApplicationRuleConfigServiceBlockingStub.updateLabelApplicationRule(request);
});
() ->
labelApplicationRuleConfigServiceBlockingStub.updateLabelApplicationRule(request));
assertEquals(Status.NOT_FOUND, Status.fromThrowable(exception));
}

@Test
void deleteApplicationRule() {
LabelApplicationRule simpleRule = createSimpleRule("auth", "valid");
LabelApplicationRule simpleRule = createSimpleRule();
LabelApplicationRule compositeRule = createCompositeRule();
List<LabelApplicationRule> rules = List.of(simpleRule, compositeRule);
rules.forEach(
Expand All @@ -173,39 +171,38 @@ void deleteApplicationRuleError() {
Throwable exception =
assertThrows(
StatusRuntimeException.class,
() -> {
labelApplicationRuleConfigServiceBlockingStub.deleteLabelApplicationRule(request);
});
() ->
labelApplicationRuleConfigServiceBlockingStub.deleteLabelApplicationRule(request));
assertEquals(Status.NOT_FOUND, Status.fromThrowable(exception));
}

private LabelApplicationRuleData buildCompositeRuleData() {
// This condition implies foo(key) exists AND foo(key) = bar(value) AND
// req.http.headers.auth(key) = valid(value)
StringCondition fooKeyCondition =
StringCondition.newBuilder()
.setOperator(StringCondition.Operator.OPERATOR_EQUALS)
StringKeyCondition fooKeyCondition =
StringKeyCondition.newBuilder()
.setOperator(StringKeyCondition.Operator.OPERATOR_EQUALS)
.setValue("foo")
.build();
UnaryCondition fooUnaryValueCondition =
UnaryCondition.newBuilder().setOperator(UnaryCondition.Operator.OPERATOR_EXISTS).build();
StringCondition fooStringValueCondition =
StringCondition.newBuilder()
.setOperator(StringCondition.Operator.OPERATOR_EQUALS)
StringValueCondition fooStringValueCondition =
StringValueCondition.newBuilder()
.setOperator(StringValueCondition.Operator.OPERATOR_EQUALS)
.setValue("bar")
.build();

StringCondition authKeyCondition =
StringCondition.newBuilder()
.setOperator(StringCondition.Operator.OPERATOR_EQUALS)
StringKeyCondition authKeyCondition =
StringKeyCondition.newBuilder()
.setOperator(StringKeyCondition.Operator.OPERATOR_EQUALS)
.setValue("auth")
.build();
JsonCondition authJsonValueCondition =
JsonCondition.newBuilder()
.setJsonPath("req.http.headers")
.setStringCondition(
StringCondition.newBuilder()
.setOperator(StringCondition.Operator.OPERATOR_EQUALS)
StringValueCondition.newBuilder()
.setOperator(StringValueCondition.Operator.OPERATOR_EQUALS)
.setValue("valid")
.build())
.build();
Expand Down Expand Up @@ -250,14 +247,14 @@ private LabelApplicationRuleData buildCompositeRuleData() {
}

private LabelApplicationRuleData buildSimpleRuleData(String key, String value) {
StringCondition fooKeyCondition =
StringCondition.newBuilder()
.setOperator(StringCondition.Operator.OPERATOR_EQUALS)
StringKeyCondition fooKeyCondition =
StringKeyCondition.newBuilder()
.setOperator(StringKeyCondition.Operator.OPERATOR_EQUALS)
.setValue(key)
.build();
StringCondition fooValueCondition =
StringCondition.newBuilder()
.setOperator(StringCondition.Operator.OPERATOR_EQUALS)
StringValueCondition fooValueCondition =
StringValueCondition.newBuilder()
.setOperator(StringValueCondition.Operator.OPERATOR_EQUALS)
.setValue(value)
.build();
LeafCondition leafCondition =
Expand All @@ -274,8 +271,8 @@ private LabelApplicationRuleData buildSimpleRuleData(String key, String value) {
.build();
}

private LabelApplicationRule createSimpleRule(String key, String value) {
LabelApplicationRuleData simpleRuleData = buildSimpleRuleData(key, value);
private LabelApplicationRule createSimpleRule() {
LabelApplicationRuleData simpleRuleData = buildSimpleRuleData("auth", "valid");
CreateLabelApplicationRuleRequest simpleRuleRequest =
CreateLabelApplicationRuleRequest.newBuilder().setData(simpleRuleData).build();
CreateLabelApplicationRuleResponse simpleRuleResponse =
Expand All @@ -284,8 +281,6 @@ private LabelApplicationRule createSimpleRule(String key, String value) {
}

private LabelApplicationRule createCompositeRule() {
Map<String, LabelApplicationRule> createdRulesById = new HashMap<>();

LabelApplicationRuleData compositeRuleData = buildCompositeRuleData();
CreateLabelApplicationRuleRequest compositeRuleRequest =
CreateLabelApplicationRuleRequest.newBuilder().setData(compositeRuleData).build();
Expand Down
Loading
Loading