[go: up one dir, main page]

Add comprehensive integration spec and fix validation without explicit defaults

What does this MR do and why?

  • Add comprehensive integration spec for ciPipelineCreationInputs GraphQL query with:
    • All input types (string, number, boolean)
    • String variations (description, options, regex)
    • Required vs optional inputs
    • Rules-based inputs
    • Verifies all fields are properly returned as hashes
  • Fix validation for rules-based inputs without explicit defaults. When a rule matches but has options without a default value, auto-use the first option as the default. This prevents validation errors while maintaining backward compatibility.

I used the following config to stress test the feature:

With a valid config:

spec:
  inputs:
    # Level 1: Base selections
    cloud_provider:
      options: ['aws', 'gcp', 'azure']
      default: 'aws'

    environment:
      options: ['development', 'staging', 'production']
      default: 'development'

    deployment_type:
      options: ['rolling', 'blue_green', 'canary']
      default: 'rolling'

    # Level 2: Always has options regardless of selections
    instance_type:
      rules:
        - if: $[[ inputs.cloud_provider ]] == 'aws' && $[[ inputs.environment ]] == 'development'
          options: ['t3.micro', 't3.small']
          default: 't3.micro'
        - if: $[[ inputs.cloud_provider ]] == 'aws' && $[[ inputs.environment ]] == 'staging'
          options: ['t3.medium', 't3.large']
          default: 't3.medium'
        - if: $[[ inputs.cloud_provider ]] == 'aws' && $[[ inputs.environment ]] == 'production'
          options: ['t3.xlarge', 't3.2xlarge']
          default: 't3.xlarge'
        - if: $[[ inputs.cloud_provider ]] == 'gcp' && $[[ inputs.environment ]] == 'development'
          options: ['e2-micro', 'e2-small']
          default: 'e2-micro'
        - if: $[[ inputs.cloud_provider ]] == 'gcp' && $[[ inputs.environment ]] == 'staging'
          options: ['e2-small', 'e2-medium']
          default: 'e2-small'
        - if: $[[ inputs.cloud_provider ]] == 'gcp' && $[[ inputs.environment ]] == 'production'
          options: ['e2-standard-4', 'e2-standard-8']
          default: 'e2-standard-4'
        - if: $[[ inputs.cloud_provider ]] == 'azure' && $[[ inputs.environment ]] == 'development'
          options: ['Standard_B1s', 'Standard_B1ms']
          default: 'Standard_B1s'
        - if: $[[ inputs.cloud_provider ]] == 'azure' && $[[ inputs.environment ]] == 'staging'
          options: ['Standard_B2s', 'Standard_B2ms']
          default: 'Standard_B2s'
        # Catch-all for azure production or any other combo
        - options: ['Standard_D2s_v3', 'Standard_D4s_v3']
          default: 'Standard_D2s_v3'

    # Level 3: Multi-condition with full coverage
    resource_tier:
      rules:
        - if: $[[ inputs.environment ]] == 'production' && $[[ inputs.deployment_type ]] == 'canary'
          options: ['large', 'xlarge', 'xxlarge']
          default: 'large'
        - if: $[[ inputs.environment ]] == 'production'
          options: ['large', 'xlarge']
          default: 'xlarge'
        - if: $[[ inputs.environment ]] == 'staging'
          options: ['medium', 'large']
          default: 'medium'
        # Catch-all for development
        - options: ['small', 'medium']
          default: 'small'

    # Level 4: Complex dependencies but always resolves
    storage_type:
      rules:
        - if: $[[ inputs.cloud_provider ]] == 'aws' && $[[ inputs.environment ]] == 'production' && $[[ inputs.resource_tier ]] == 'xxlarge'
          options: ['io2', 'io1', 'gp3']
          default: 'io2'
        - if: $[[ inputs.cloud_provider ]] == 'aws' && $[[ inputs.environment ]] == 'production'
          options: ['gp3', 'io1', 'gp2']
          default: 'gp3'
        - if: $[[ inputs.cloud_provider ]] == 'aws'
          options: ['gp2', 'gp3']
          default: 'gp2'
        - if: $[[ inputs.cloud_provider ]] == 'gcp' && $[[ inputs.environment ]] == 'production'
          options: ['pd-ssd', 'pd-extreme']
          default: 'pd-ssd'
        - if: $[[ inputs.cloud_provider ]] == 'gcp'
          options: ['pd-standard', 'pd-balanced']
          default: 'pd-standard'
        # Catch-all for Azure
        - options: ['Premium_LRS', 'StandardSSD_LRS']
          default: 'Premium_LRS'

    backup_frequency:
      rules:
        - if: $[[ inputs.environment ]] == 'production' && $[[ inputs.storage_type ]] == 'io2'
          options: ['hourly', '4hours', 'daily']
          default: 'hourly'
        - if: $[[ inputs.environment ]] == 'production'
          options: ['daily', 'weekly']
          default: 'daily'
        - if: $[[ inputs.environment ]] == 'staging'
          options: ['weekly', 'monthly']
          default: 'weekly'
        - options: ['monthly', 'never']
          default: 'never'

---
deploy:
  script: |
    echo "Cloud: $[[ inputs.cloud_provider ]]"
    echo "Env: $[[ inputs.environment ]]"
    echo "Strategy: $[[ inputs.deployment_type ]]"
    echo "Instance: $[[ inputs.instance_type ]]"
    echo "Resources: $[[ inputs.resource_tier ]]"
    echo "Storage: $[[ inputs.storage_type ]]"
    echo "Backups: $[[ inputs.backup_frequency ]]"

With an invalid config (testing for weird stuff):

spec:
  inputs:
    # Level 1: Base selections
    cloud_provider:
      options: ['aws', 'gcp', 'azure']
      default: 'aws'
      description: 'Cloud provider'

    environment:
      options: ['development', 'staging', 'production']
      default: 'development'
      description: 'Target environment'

    # Level 2: Depends on cloud + environment
    instance_type:
      description: 'VM instance type'
      rules:
        - if: $[[ inputs.cloud_provider ]] == 'aws' && $[[ inputs.environment ]] == 'development'
          options: ['t3.micro', 't3.small']
          default: 't3.micro'
        - if: $[[ inputs.cloud_provider ]] == 'aws' && $[[ inputs.environment ]] == 'staging'
          options: ['t3.medium', 't3.large']
          default: 't3.medium'
        - if: $[[ inputs.cloud_provider ]] == 'aws' && $[[ inputs.environment ]] == 'production'
          options: ['t3.xlarge', 't3.2xlarge', 'm5.xlarge']
          default: 't3.xlarge'
        - if: $[[ inputs.cloud_provider ]] == 'gcp' && $[[ inputs.environment ]] == 'development'
          options: ['e2-micro', 'e2-small']
          default: 'e2-micro'
        - if: $[[ inputs.cloud_provider ]] == 'gcp' && $[[ inputs.environment ]] == 'production'
          options: ['e2-standard-4', 'e2-standard-8', 'n1-standard-4']
          default: 'e2-standard-4'
        - if: $[[ inputs.cloud_provider ]] == 'azure'
          options: ['Standard_B1s', 'Standard_B2s', 'Standard_D2s_v3']
          default: 'Standard_B1s'
        - options: []

    deployment_type:
      options: ['rolling', 'blue_green', 'canary']
      default: 'rolling'
      description: 'Deployment strategy'

    # Level 3: Depends on environment + deployment_type
    canary_percentage:
      description: 'Canary rollout percentage'
      rules:
        - if: $[[ inputs.deployment_type ]] == 'canary' && $[[ inputs.environment ]] == 'production'
          options: ['10', '25', '50', '75']
          default: '25'
        - if: $[[ inputs.deployment_type ]] == 'canary' && $[[ inputs.environment ]] == 'staging'
          options: ['50', '100']
          default: '50'
        - if: $[[ inputs.deployment_type ]] == 'canary'
          options: ['100']
          default: '100'
        - options: []

    # Level 4: Depends on cloud + environment + instance
    storage_tier:
      description: 'Storage performance tier'
      rules:
        - if: $[[ inputs.cloud_provider ]] == 'aws' && $[[ inputs.environment ]] == 'production' && $[[ inputs.instance_type ]] == 't3.xlarge'
          options: ['gp3', 'io1', 'io2']
          default: 'gp3'
        - if: $[[ inputs.cloud_provider ]] == 'aws' && $[[ inputs.environment ]] == 'production'
          options: ['gp3', 'gp2']
          default: 'gp3'
        - if: $[[ inputs.cloud_provider ]] == 'aws'
          options: ['gp2', 'gp3']
          default: 'gp2'
        - if: $[[ inputs.cloud_provider ]] == 'gcp' && $[[ inputs.environment ]] == 'production'
          options: ['pd-ssd', 'pd-extreme']
          default: 'pd-ssd'
        - if: $[[ inputs.cloud_provider ]] == 'gcp'
          options: ['pd-standard', 'pd-ssd']
          default: 'pd-standard'
        - options: ['standard']

    # Edge case: Complex multi-condition
    monitoring_level:
      description: 'Monitoring verbosity'
      rules:
        - if: $[[ inputs.environment ]] == 'production' && $[[ inputs.deployment_type ]] == 'canary'
          options: ['verbose', 'standard', 'minimal']
          default: 'verbose'
        - if: $[[ inputs.environment ]] == 'production'
          options: ['standard', 'minimal']
          default: 'standard'
        - if: $[[ inputs.environment ]] == 'staging' && $[[ inputs.cloud_provider ]] == 'aws'
          options: ['standard', 'debug']
          default: 'standard'
        - options: ['minimal']

---
deploy:
  script: |
    echo "Deploying to $[[ inputs.cloud_provider ]]"
    echo "Environment: $[[ inputs.environment ]]"
    echo "Instance: $[[ inputs.instance_type ]]"
    echo "Strategy: $[[ inputs.deployment_type ]]"
    echo "Canary: $[[ inputs.canary_percentage ]]%"
    echo "Storage: $[[ inputs.storage_tier ]]"
    echo "Monitoring: $[[ inputs.monitoring_level ]]"

MR acceptance checklist

Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Laura Montemayor

Merge request reports

Loading