/// <summary> /// Validation fails iof tracked resource fails to meet one of the four required criteria. /// </summary> /// <param name="definitions">Operation Definition to validate</param> /// <param name="formatParameters">The noun to be put in the failure message</param> /// <returns></returns> public override bool IsValid(Dictionary <string, Schema> definitions, RuleContext context, out object[] formatParameters) { IEnumerable <Operation> getOperations = ValidationUtilities.GetOperationsByRequestMethod("get", (ServiceDefinition)context.Root); foreach (KeyValuePair <string, Schema> definition in definitions) { if (!exemptedNames.IsMatch(definition.Key) && ValidationUtilities.IsTrackedResource(definition.Value, definitions)) { bool getCheck = getOperations.Any(operation => operation.Responses.Any(response => response.Key.Equals("200") && response.Value.Schema != null && response.Value.Schema.Reference != null && response.Value.Schema.Reference.EndsWith("/" + definition.Key) ) ); if (!getCheck) { formatParameters = new object[2]; formatParameters[0] = definition.Key; formatParameters[1] = 1; return(false); } bool listByResourceGroupCheck = this.ListByXCheck(getOperations, listByRgRegEx, definition.Key, definitions); if (!listByResourceGroupCheck) { formatParameters = new object[2]; formatParameters[0] = definition.Key; formatParameters[1] = 2; return(false); } bool listBySubscriptionIdCheck = this.ListByXCheck(getOperations, listBySidRegEx, definition.Key, definitions); if (!listBySubscriptionIdCheck) { formatParameters = new object[2]; formatParameters[0] = definition.Key; formatParameters[1] = 3; return(false); } bool schemaResult = this.HandleSchema(definition.Value, definitions); if (!schemaResult) { formatParameters = new object[2]; formatParameters[0] = definition.Key; formatParameters[1] = 4; return(false); } } } formatParameters = new object[0]; return(true); }
// Verifies if a tracked resource has a corresponding patch operation public override IEnumerable <ValidationMessage> GetValidationMessages(Dictionary <string, Schema> definitions, RuleContext context) { ServiceDefinition serviceDefinition = (ServiceDefinition)context.Root; IEnumerable <Operation> patchOperations = ValidationUtilities.GetOperationsByRequestMethod("patch", serviceDefinition); var respDefinitions = ValidationUtilities.GetResponseModelDefinitions(serviceDefinition); foreach (KeyValuePair <string, Schema> definition in definitions) { if (respDefinitions.Contains(definition.Key) && ValidationUtilities.IsTrackedResource(definition.Value, definitions)) { if (!patchOperations.Any(op => (op.Responses["200"]?.Schema?.Reference?.StripDefinitionPath()) == definition.Key)) { // if no patch operation returns current tracked resource as a response, // the tracked resource does not have a corresponding patch operation yield return(new ValidationMessage(new FileObjectPath(context.File, context.Path), this, definition.Key.StripDefinitionPath())); } } } }
// Verifies if a tracked resource has a corresponding get operation public override IEnumerable <ValidationMessage> GetValidationMessages(Dictionary <string, Schema> definitions, RuleContext context) { ServiceDefinition serviceDefinition = (ServiceDefinition)context.Root; IEnumerable <Operation> getOperations = ValidationUtilities.GetOperationsByRequestMethod("get", serviceDefinition); // filter out the model definitions that are not being returned as a response var respDefinitions = ValidationUtilities.GetResponseModelDefinitions(serviceDefinition); foreach (KeyValuePair <string, Schema> definition in definitions) { if (respDefinitions.Contains(definition.Key) && ValidationUtilities.IsTrackedResource(definition.Value, definitions)) { // check for 200 status response models since they correspond to a successful get operation if (!getOperations.Any(op => (op.Responses["200"]?.Schema?.Reference?.StripDefinitionPath()) == definition.Key)) { // if no GET operation returns current tracked resource as a response, // the tracked resource does not have a corresponding get operation yield return(new ValidationMessage(new FileObjectPath(context.File, context.Path), this, definition.Key.StripDefinitionPath())); } } } }