AWS specific components for managing endpoints in Smithy
The validation components provide validators for AWS-specific endpoint rules, built-in parameters, and special case configurations. These validators ensure proper configuration and usage of AWS endpoint features in Smithy models.
/**
* Validator for AWS built-in parameters in rule sets.
* Ensures proper usage of AWS-specific built-in parameters in endpoint rules.
*/
public final class RuleSetAwsBuiltInValidator implements Validator {
/**
* Validates AWS built-in parameter usage across the model
* @param model Smithy model to validate
* @return Stream of validation events
*/
public Stream<ValidationEvent> validate(Model model);
/**
* Gets the validator name
* @return Validator identifier
*/
public String getName();
}/**
* Validator for AWS endpoint special case configurations.
* Validates special case endpoint configurations for AWS services.
*/
public final class AwsSpecialCaseEndpointValidator implements Validator {
/**
* Validates AWS special case endpoint configurations
* @param model Smithy model to validate
* @return Stream of validation events
*/
public Stream<ValidationEvent> validate(Model model);
/**
* Gets the validator name
* @return Validator identifier
*/
public String getName();
}/**
* Migration utility for SigV4 endpoint configurations.
* Handles migration of endpoint authentication configurations.
*/
public final class EndpointSigV4Migration implements DiffEvaluator {
/**
* Evaluates differences in endpoint SigV4 configurations
* @param context Diff evaluation context
* @return List of differences found
*/
public List<ValidationEvent> evaluate(DiffEvaluator.Context context);
/**
* Gets the evaluator name
* @return Evaluator identifier
*/
public String getName();
}Usage Examples:
import software.amazon.smithy.rulesengine.aws.validators.*;
import software.amazon.smithy.model.validation.ValidatedResult;
import software.amazon.smithy.model.Model;
// Validate a model with AWS validators
Model model = // ... load your model
ValidatedResult<Model> result = Model.assembler()
.addValidator(new RuleSetAwsBuiltInValidator())
.addValidator(new AwsSpecialCaseEndpointValidator())
.assemble();
// Check for validation errors
if (result.isBroken()) {
result.getValidationEvents().forEach(event -> {
System.err.println(event.getSeverity() + ": " + event.getMessage());
});
}
// Use in diff evaluation for migrations
EndpointSigV4Migration migration = new EndpointSigV4Migration();
// Applied automatically during model diffingThe RuleSetAwsBuiltInValidator enforces these rules:
S3_*) are only used in S3 endpoint rulesSTS_*) are only used in STS endpoint rulesS3_CONTROL_*) usage// Example validation events that might be generated:
// Invalid built-in usage
ValidationEvent error1 = ValidationEvent.builder()
.severity(Severity.ERROR)
.message("S3-specific built-in 'AWS::S3::Accelerate' cannot be used in non-S3 service")
.sourceLocation(SourceLocation.none())
.build();
// Missing required parameter
ValidationEvent error2 = ValidationEvent.builder()
.severity(Severity.ERROR)
.message("Required built-in parameter 'AWS::Region' is not defined")
.sourceLocation(SourceLocation.none())
.build();
// Type mismatch
ValidationEvent error3 = ValidationEvent.builder()
.severity(Severity.ERROR)
.message("Built-in 'AWS::UseDualStack' expects boolean value, got string")
.sourceLocation(SourceLocation.none())
.build();The AwsSpecialCaseEndpointValidator enforces these rules:
// Example special case validation events:
// Invalid partition
ValidationEvent error1 = ValidationEvent.builder()
.severity(Severity.ERROR)
.message("Unknown AWS partition 'aws-invalid' in special case configuration")
.sourceLocation(SourceLocation.none())
.build();
// Invalid endpoint template
ValidationEvent error2 = ValidationEvent.builder()
.severity(Severity.ERROR)
.message("Endpoint template contains undefined variable: {invalid}")
.sourceLocation(SourceLocation.none())
.build();
// Inconsistent capabilities
ValidationEvent error3 = ValidationEvent.builder()
.severity(Severity.WARNING)
.message("FIPS capability declared but not supported in partition 'aws-cn'")
.sourceLocation(SourceLocation.none())
.build();The validators are automatically registered through the Java Service Provider Interface:
META-INF/services/software.amazon.smithy.model.validation.ValidatorRegistration includes:
RuleSetAwsBuiltInValidatorAwsSpecialCaseEndpointValidatorThe migration utility is registered through:
META-INF/services/software.amazon.smithy.diff.DiffEvaluatorRegistration includes:
EndpointSigV4Migration// Validators are automatically applied during model assembly
Model model = Model.assembler()
.discoverModels(getClass().getClassLoader())
.assemble()
.unwrap(); // Validators run automatically
// Manual validator application
ValidatedResult<Model> result = Model.assembler()
.addValidator(new RuleSetAwsBuiltInValidator())
.addValidator(new AwsSpecialCaseEndpointValidator())
.discoverModels()
.assemble();// Create custom validation context for specific scenarios
ValidationEvent.Builder eventBuilder = ValidationEvent.builder()
.severity(Severity.ERROR)
.sourceLocation(shape.getSourceLocation())
.shapeId(shape.getId());
// Apply context-specific validation rules
if (isAwsService(shape)) {
// Apply AWS-specific validation
validator.validateAwsService(shape, eventBuilder);
}// Evaluate model differences for migrations
ModelDiff diff = ModelDiff.builder()
.oldModel(oldModel)
.newModel(newModel)
.build();
DiffEvaluator.Context context = DiffEvaluator.Context.builder()
.diff(diff)
.oldModel(oldModel)
.newModel(newModel)
.build();
EndpointSigV4Migration migration = new EndpointSigV4Migration();
List<ValidationEvent> migrationEvents = migration.evaluate(context);// Extend validation for custom requirements
public class CustomAwsValidator implements Validator {
@Override
public Stream<ValidationEvent> validate(Model model) {
return model.shapes()
.filter(this::hasAwsTraits)
.flatMap(this::validateAwsConfiguration);
}
private boolean hasAwsTraits(Shape shape) {
return shape.hasTrait(RuleBasedEndpointsTrait.class) ||
shape.hasTrait(EndpointModifierTrait.class);
}
}// Safe migration patterns
public void performMigration(Model oldModel, Model newModel) {
// 1. Validate both models
validateModel(oldModel);
validateModel(newModel);
// 2. Evaluate migration
List<ValidationEvent> migrationIssues = evaluateMigration(oldModel, newModel);
// 3. Handle breaking changes
migrationIssues.stream()
.filter(event -> event.getSeverity() == Severity.ERROR)
.forEach(this::handleBreakingChange);
}Install with Tessl CLI
npx tessl i tessl/maven-software-amazon-smithy--smithy-aws-endpoints