Add comprehensive integration spec and fix validation without explicit defaults
What does this MR do and why?
- Add comprehensive integration spec for
ciPipelineCreationInputsGraphQL 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