/// <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);
        }
示例#2
0
        // 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()));
                    }
                }
            }
        }