{
  "description": "Rover is the Schema for the rovers API\nRover resources define API exposures and subscriptions for applications",
  "properties": {
    "apiVersion": {
      "type": "string",
      "description": "Must be \"rover.cp.ei.telekom.de/v1\".",
      "const": "rover.cp.ei.telekom.de/v1"
    },
    "kind": {
      "type": "string",
      "description": "Must be \"Rover\".",
      "const": "Rover"
    },
    "metadata": {
      "type": "object",
      "description": "Standard Kubernetes object metadata. See https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/object-meta/",
      "properties": {
        "name": {
          "type": "string",
          "description": "Name must be unique within a namespace. Is required when creating resources."
        },
        "namespace": {
          "type": "string",
          "description": "Namespace defines the space within which each name must be unique."
        },
        "labels": {
          "type": "object",
          "description": "Map of string keys and values that can be used to organize and categorize objects.",
          "additionalProperties": {
            "type": "string"
          }
        },
        "annotations": {
          "type": "object",
          "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools.",
          "additionalProperties": {
            "type": "string"
          }
        },
        "generateName": {
          "type": "string",
          "description": "GenerateName is an optional prefix, used by the server, to generate a unique name only if the Name field has not been provided."
        }
      }
    },
    "spec": {
      "description": "Spec defines the desired state of the Rover resource",
      "properties": {
        "clientSecret": {
          "description": "ClientSecret is the secret used for client authentication\nIf not specified, a randomly generated secret will be used",
          "type": "string"
        },
        "exposures": {
          "description": "Exposures is a list of APIs and Events that this Rover exposes to consumers",
          "items": {
            "description": "Exposure defines a service that is exposed by this Rover",
            "properties": {
              "api": {
                "description": "Api defines an API-based service exposure configuration",
                "properties": {
                  "approval": {
                    "description": "Approval defines the approval workflow required for this API exposure",
                    "properties": {
                      "strategy": {
                        "default": "Simple",
                        "description": "Strategy defines the approval process required for this API",
                        "enum": [
                          "Auto",
                          "Simple",
                          "FourEyes"
                        ],
                        "type": "string"
                      },
                      "trustedTeams": {
                        "description": "TrustedTeams identifies teams that are trusted for approving this API\nPer default your own team is trusted",
                        "items": {
                          "description": "TrustedTeam identifies a team that is trusted for approvals",
                          "properties": {
                            "group": {
                              "description": "Group identifies the organizational group for this trusted team",
                              "minLength": 1,
                              "type": "string"
                            },
                            "team": {
                              "description": "Team identifies the specific team within the group",
                              "minLength": 1,
                              "type": "string"
                            }
                          },
                          "required": [
                            "group",
                            "team"
                          ],
                          "type": "object"
                        },
                        "maxItems": 10,
                        "minItems": 0,
                        "type": "array"
                      }
                    },
                    "required": [
                      "strategy"
                    ],
                    "type": "object"
                  },
                  "basePath": {
                    "description": "BasePath is the base path of the API (must start with /)",
                    "pattern": "^/.*$",
                    "type": "string"
                  },
                  "security": {
                    "description": "Security defines optional security configuration for this API",
                    "properties": {
                      "m2m": {
                        "description": "M2M defines machine-to-machine authentication configuration",
                        "properties": {
                          "basic": {
                            "description": "Basic defines basic authentication configuration",
                            "properties": {
                              "password": {
                                "description": "Password for basic authentication",
                                "minLength": 1,
                                "type": "string"
                              },
                              "username": {
                                "description": "Username for basic authentication",
                                "minLength": 1,
                                "type": "string"
                              }
                            },
                            "required": [
                              "password",
                              "username"
                            ],
                            "type": "object"
                          },
                          "externalIDP": {
                            "description": "ExternalIDP defines external identity provider configuration",
                            "properties": {
                              "basic": {
                                "description": "Basic defines basic auth credentials for the OAuth2 token request",
                                "properties": {
                                  "password": {
                                    "description": "Password for basic authentication",
                                    "minLength": 1,
                                    "type": "string"
                                  },
                                  "username": {
                                    "description": "Username for basic authentication",
                                    "minLength": 1,
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "password",
                                  "username"
                                ],
                                "type": "object"
                              },
                              "client": {
                                "description": "Client defines client credentials for the OAuth2 token request",
                                "properties": {
                                  "clientId": {
                                    "description": "ClientId identifies the client for OAuth2 client credentials flow",
                                    "type": "string"
                                  },
                                  "clientKey": {
                                    "description": "ClientKey is the private key associated with the client ID",
                                    "type": "string"
                                  },
                                  "clientSecret": {
                                    "description": "ClientSecret is the secret associated with the client ID",
                                    "type": "string"
                                  }
                                },
                                "type": "object",
                                "x-kubernetes-validations": [
                                  {
                                    "message": "ClientSecret and ClientKey cannot be used together",
                                    "rule": "self == null || (has(self.clientKey) ? (!has(self.clientSecret)) : true)"
                                  },
                                  {
                                    "message": "At least one of clientSecret or clientKey must be provided",
                                    "rule": "self == null || has(self.clientSecret) || has(self.clientKey)"
                                  }
                                ]
                              },
                              "grantType": {
                                "description": "GrantType defines the OAuth2 grant type to use for the token request",
                                "enum": [
                                  "client_credentials",
                                  "authorization_code",
                                  "password"
                                ],
                                "type": "string"
                              },
                              "tokenEndpoint": {
                                "description": "TokenEndpoint is the URL for the OAuth2 token endpoint",
                                "format": "uri",
                                "type": "string"
                              },
                              "tokenRequest": {
                                "description": "TokenRequest is the type of token request, \"body\" or \"header\"",
                                "enum": [
                                  "body",
                                  "header"
                                ],
                                "type": "string"
                              }
                            },
                            "required": [
                              "tokenEndpoint"
                            ],
                            "type": "object",
                            "x-kubernetes-validations": [
                              {
                                "message": "Only one of basic or client credentials can be provided (XOR relationship)",
                                "rule": "self == null || !has(self.basic) || !has(self.client)"
                              }
                            ]
                          },
                          "scopes": {
                            "description": "Scopes defines additional OAuth2 scopes that are added to the LMS token",
                            "items": {
                              "type": "string"
                            },
                            "maxItems": 10,
                            "type": "array"
                          }
                        },
                        "type": "object",
                        "x-kubernetes-validations": [
                          {
                            "message": "ExternalIDP and basic authentication cannot be used together",
                            "rule": "self == null || (has(self.externalIDP) ? (!has(self.basic)) : true)"
                          },
                          {
                            "message": "Scopes and basic authentication cannot be used together",
                            "rule": "self == null || (has(self.scopes) ? (!has(self.basic)) : true)"
                          },
                          {
                            "message": "At least one of externalIDP, basic, or scopes must be provided",
                            "rule": "self == null || has(self.externalIDP) || has(self.basic) || has(self.scopes)"
                          }
                        ]
                      }
                    },
                    "type": "object"
                  },
                  "traffic": {
                    "description": "Traffic defines optional traffic management configuration for this API",
                    "properties": {
                      "circuitBreaker": {
                        "description": "CircuitBreaker defines the Kong circuit breaker configuration",
                        "properties": {
                          "enabled": {
                            "default": false,
                            "description": "CircuitBreaker flags if the Kong circuit breaker feature should be used",
                            "type": "boolean"
                          }
                        },
                        "type": "object"
                      },
                      "failover": {
                        "description": "Failover defines disaster recovery configuration for this API",
                        "properties": {
                          "zones": {
                            "description": "Zones is a list of zone names to use for failover if the primary zone is unavailable",
                            "items": {
                              "type": "string"
                            },
                            "maxItems": 10,
                            "type": "array"
                          }
                        },
                        "type": "object"
                      },
                      "loadBalancing": {
                        "description": "LoadBalancing defines how traffic is distributed among multiple upstream servers",
                        "properties": {
                          "strategy": {
                            "default": "RoundRobin",
                            "description": "Strategy defines the algorithm used for distributing traffic (RoundRobin, LeastConnections)",
                            "enum": [
                              "RoundRobin",
                              "LeastConnections"
                            ],
                            "type": "string"
                          }
                        },
                        "type": "object"
                      },
                      "rateLimit": {
                        "description": "RateLimit defines request rate limiting for this API",
                        "properties": {
                          "consumers": {
                            "description": "Consumers defines rate limits applied to API consumers (clients)",
                            "properties": {
                              "default": {
                                "description": "Default defines the rate limit applied to all consumers not specifically overridden",
                                "properties": {
                                  "limits": {
                                    "description": "Limits defines the actual rate limit values for different time windows",
                                    "properties": {
                                      "hour": {
                                        "description": "Hour defines the maximum number of requests allowed per hour",
                                        "minimum": 0,
                                        "type": "integer"
                                      },
                                      "minute": {
                                        "description": "Minute defines the maximum number of requests allowed per minute",
                                        "minimum": 0,
                                        "type": "integer"
                                      },
                                      "second": {
                                        "description": "Second defines the maximum number of requests allowed per second",
                                        "minimum": 0,
                                        "type": "integer"
                                      }
                                    },
                                    "type": "object"
                                  }
                                },
                                "required": [
                                  "limits"
                                ],
                                "type": "object"
                              },
                              "overrides": {
                                "description": "Overrides defines consumer-specific rate limits",
                                "items": {
                                  "properties": {
                                    "consumer": {
                                      "minLength": 1,
                                      "type": "string"
                                    },
                                    "limits": {
                                      "description": "Limits defines the actual rate limit values for different time windows",
                                      "properties": {
                                        "hour": {
                                          "description": "Hour defines the maximum number of requests allowed per hour",
                                          "minimum": 0,
                                          "type": "integer"
                                        },
                                        "minute": {
                                          "description": "Minute defines the maximum number of requests allowed per minute",
                                          "minimum": 0,
                                          "type": "integer"
                                        },
                                        "second": {
                                          "description": "Second defines the maximum number of requests allowed per second",
                                          "minimum": 0,
                                          "type": "integer"
                                        }
                                      },
                                      "type": "object"
                                    }
                                  },
                                  "required": [
                                    "consumer",
                                    "limits"
                                  ],
                                  "type": "object"
                                },
                                "maxItems": 10,
                                "type": "array"
                              }
                            },
                            "type": "object"
                          },
                          "provider": {
                            "description": "Provider defines rate limits applied by the API provider (owner)",
                            "properties": {
                              "limits": {
                                "description": "Limits defines the actual rate limit values for different time windows",
                                "properties": {
                                  "hour": {
                                    "description": "Hour defines the maximum number of requests allowed per hour",
                                    "minimum": 0,
                                    "type": "integer"
                                  },
                                  "minute": {
                                    "description": "Minute defines the maximum number of requests allowed per minute",
                                    "minimum": 0,
                                    "type": "integer"
                                  },
                                  "second": {
                                    "description": "Second defines the maximum number of requests allowed per second",
                                    "minimum": 0,
                                    "type": "integer"
                                  }
                                },
                                "type": "object"
                              },
                              "options": {
                                "description": "RateLimitOptions defines additional configuration options for rate limiting",
                                "properties": {
                                  "faultTolerant": {
                                    "default": true,
                                    "description": "FaultTolerant defines if the rate limit plugin should be fault tolerant, if gateway is not able to access the config store",
                                    "type": "boolean"
                                  },
                                  "hideClientHeaders": {
                                    "default": false,
                                    "description": "HideClientHeaders hides additional client headers which give information about the rate-limit, reset and remaining requests for consumers if set to true.",
                                    "type": "boolean"
                                  }
                                },
                                "type": "object"
                              }
                            },
                            "type": "object"
                          }
                        },
                        "type": "object"
                      }
                    },
                    "type": "object"
                  },
                  "transformation": {
                    "description": "Transformation defines optional request/response transformations for this API",
                    "properties": {
                      "request": {
                        "description": "Request defines transformations applied to incoming API requests",
                        "properties": {
                          "headers": {
                            "description": "Headers defines HTTP header modifications for requests",
                            "properties": {
                              "add": {
                                "description": "Add is a list of HTTP headers to add to the request/response",
                                "items": {
                                  "type": "string"
                                },
                                "maxItems": 5,
                                "minItems": 1,
                                "type": "array"
                              },
                              "remove": {
                                "description": "Remove is a list of HTTP header names to remove",
                                "items": {
                                  "type": "string"
                                },
                                "maxItems": 5,
                                "minItems": 1,
                                "type": "array"
                              }
                            },
                            "type": "object"
                          }
                        },
                        "type": "object"
                      }
                    },
                    "type": "object"
                  },
                  "upstreams": {
                    "description": "Upstreams defines the backend service endpoints for this API",
                    "items": {
                      "description": "Upstream defines a backend service endpoint for an API",
                      "properties": {
                        "url": {
                          "description": "URL is the endpoint URL for the backend service",
                          "format": "uri",
                          "type": "string"
                        },
                        "weight": {
                          "default": 1,
                          "description": "Weight defines the load balancing weight for this upstream (when multiple upstreams)",
                          "maximum": 100,
                          "minimum": 1,
                          "type": "integer"
                        }
                      },
                      "required": [
                        "url"
                      ],
                      "type": "object"
                    },
                    "maxItems": 12,
                    "minItems": 1,
                    "type": "array"
                  },
                  "visibility": {
                    "default": "Enterprise",
                    "description": "Visibility defines the access scope for this API",
                    "enum": [
                      "World",
                      "Zone",
                      "Enterprise"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "approval",
                  "basePath",
                  "upstreams",
                  "visibility"
                ],
                "type": "object"
              },
              "event": {
                "description": "Event defines an Event-based service exposure configuration",
                "properties": {
                  "additionalPublisherIds": {
                    "description": "AdditionalPublisherIds allows multiple application IDs to publish to the same event type",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "approval": {
                    "description": "Approval defines the approval workflow required for subscriptions to this event",
                    "properties": {
                      "strategy": {
                        "default": "Simple",
                        "description": "Strategy defines the approval process required for this API",
                        "enum": [
                          "Auto",
                          "Simple",
                          "FourEyes"
                        ],
                        "type": "string"
                      },
                      "trustedTeams": {
                        "description": "TrustedTeams identifies teams that are trusted for approving this API\nPer default your own team is trusted",
                        "items": {
                          "description": "TrustedTeam identifies a team that is trusted for approvals",
                          "properties": {
                            "group": {
                              "description": "Group identifies the organizational group for this trusted team",
                              "minLength": 1,
                              "type": "string"
                            },
                            "team": {
                              "description": "Team identifies the specific team within the group",
                              "minLength": 1,
                              "type": "string"
                            }
                          },
                          "required": [
                            "group",
                            "team"
                          ],
                          "type": "object"
                        },
                        "maxItems": 10,
                        "minItems": 0,
                        "type": "array"
                      }
                    },
                    "required": [
                      "strategy"
                    ],
                    "type": "object"
                  },
                  "eventType": {
                    "description": "EventType identifies the type of event that is published (e.g. \"de.telekom.eni.quickstart.v1\")",
                    "minLength": 1,
                    "type": "string"
                  },
                  "scopes": {
                    "description": "Scopes defines named scopes with optional publisher-side trigger filtering",
                    "items": {
                      "description": "EventScope defines a named scope with required trigger-based filtering for event exposure.\nScopes allow publishers to partition their events and apply publisher-side filters.\nEach scope must define a trigger that specifies which events belong to it.",
                      "properties": {
                        "name": {
                          "description": "Name is the unique identifier for this scope.",
                          "minLength": 1,
                          "type": "string"
                        },
                        "trigger": {
                          "description": "Trigger defines publisher-side filtering criteria for this scope.\nEvery scope must define a trigger.",
                          "properties": {
                            "responseFilter": {
                              "description": "ResponseFilter controls payload shaping (which fields to return).",
                              "properties": {
                                "mode": {
                                  "default": "Include",
                                  "description": "Mode controls whether the listed paths are included or excluded.",
                                  "enum": [
                                    "Include",
                                    "Exclude"
                                  ],
                                  "type": "string"
                                },
                                "paths": {
                                  "description": "Paths lists the JSON paths to include or exclude from the event payload.",
                                  "items": {
                                    "type": "string"
                                  },
                                  "type": "array"
                                }
                              },
                              "type": "object"
                            },
                            "selectionFilter": {
                              "description": "SelectionFilter controls event matching (which events to deliver).",
                              "properties": {
                                "attributes": {
                                  "additionalProperties": {
                                    "type": "string"
                                  },
                                  "description": "Attributes defines simple key-value equality matches on CloudEvents attributes.\nAll entries are AND-ed together.",
                                  "type": "object"
                                },
                                "expression": {
                                  "description": "Expression contains an arbitrary JSON filter expression tree\nusing logical operators (and, or) and comparisons (eq, ge, gt, le, lt, ne)\nthat is passed through to the configuration backend without structural validation.",
                                  "x-kubernetes-preserve-unknown-fields": true
                                }
                              },
                              "type": "object"
                            }
                          },
                          "type": "object"
                        }
                      },
                      "required": [
                        "name",
                        "trigger"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  },
                  "visibility": {
                    "default": "Enterprise",
                    "description": "Visibility defines who can see and subscribe to this event",
                    "enum": [
                      "World",
                      "Zone",
                      "Enterprise"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "approval",
                  "eventType",
                  "visibility"
                ],
                "type": "object"
              }
            },
            "type": "object",
            "x-kubernetes-validations": [
              {
                "message": "At least one of api or event must be specified",
                "rule": "self == null || has(self.api) || has(self.event)"
              },
              {
                "message": "Only one of api or event can be specified (XOR relationship)",
                "rule": "self == null || (!has(self.api) && has(self.event)) || (has(self.api) && !has(self.event))"
              }
            ]
          },
          "type": "array"
        },
        "ipRestrictions": {
          "description": "IpRestrictions defines IP-based access restrictions for the entire Application",
          "properties": {
            "allow": {
              "description": "Allow is a list of IP addresses or CIDR ranges that are allowed access",
              "items": {
                "type": "string"
              },
              "maxItems": 10,
              "minItems": 0,
              "type": "array",
              "x-kubernetes-validations": [
                {
                  "message": "All items must be valid IP addresses or CIDR notations",
                  "rule": "self.all(x, isCIDR(x) || isIP(x))"
                }
              ]
            },
            "deny": {
              "description": "Deny is a list of IP addresses or CIDR ranges that are denied access",
              "items": {
                "type": "string"
              },
              "maxItems": 10,
              "minItems": 0,
              "type": "array",
              "x-kubernetes-validations": [
                {
                  "message": "All items must be valid IP addresses or CIDR notations",
                  "rule": "self.all(x, isCIDR(x) || isIP(x))"
                }
              ]
            }
          },
          "type": "object"
        },
        "subscriptions": {
          "description": "Subscriptions is a list of APIs and Events that this Rover consumes from providers",
          "items": {
            "description": "Subscription defines a service that this Rover consumes",
            "properties": {
              "api": {
                "description": "Api defines an API-based service subscription configuration",
                "properties": {
                  "basePath": {
                    "description": "BasePath is the base path of the API to consume (must start with /)",
                    "pattern": "^/.*$",
                    "type": "string"
                  },
                  "organization": {
                    "description": "Organization is the organization that owns the API\nDefaults to local organization if not specified",
                    "type": "string"
                  },
                  "security": {
                    "description": "Security defines optional security configuration for this API",
                    "properties": {
                      "m2m": {
                        "description": "M2M defines machine-to-machine authentication configuration",
                        "properties": {
                          "basic": {
                            "description": "Basic defines basic authentication configuration",
                            "properties": {
                              "password": {
                                "description": "Password for basic authentication",
                                "minLength": 1,
                                "type": "string"
                              },
                              "username": {
                                "description": "Username for basic authentication",
                                "minLength": 1,
                                "type": "string"
                              }
                            },
                            "required": [
                              "password",
                              "username"
                            ],
                            "type": "object"
                          },
                          "client": {
                            "description": "Client defines client credentials for OAuth2",
                            "properties": {
                              "clientId": {
                                "description": "ClientId identifies the client for OAuth2 client credentials flow",
                                "type": "string"
                              },
                              "clientKey": {
                                "description": "ClientKey is the private key associated with the client ID",
                                "type": "string"
                              },
                              "clientSecret": {
                                "description": "ClientSecret is the secret associated with the client ID",
                                "type": "string"
                              }
                            },
                            "type": "object",
                            "x-kubernetes-validations": [
                              {
                                "message": "ClientSecret and ClientKey cannot be used together",
                                "rule": "self == null || (has(self.clientKey) ? (!has(self.clientSecret)) : true)"
                              },
                              {
                                "message": "At least one of clientSecret or clientKey must be provided",
                                "rule": "self == null || has(self.clientSecret) || has(self.clientKey)"
                              }
                            ]
                          },
                          "scopes": {
                            "description": "Scopes defines additional OAuth2 scopes that are added to the LMS token",
                            "items": {
                              "type": "string"
                            },
                            "maxItems": 10,
                            "type": "array"
                          }
                        },
                        "type": "object",
                        "x-kubernetes-validations": [
                          {
                            "message": "Client and basic authentication cannot be used together",
                            "rule": "self == null || (has(self.client) ? (!has(self.basic)) : true)"
                          },
                          {
                            "message": "At least one of client, basic, or scopes must be provided",
                            "rule": "self == null || has(self.client) || has(self.basic) || has(self.scopes)"
                          }
                        ]
                      }
                    },
                    "type": "object"
                  },
                  "traffic": {
                    "description": "Traffic defines optional traffic management configuration for this API",
                    "properties": {
                      "failover": {
                        "description": "Failover defines disaster recovery configuration for this API",
                        "properties": {
                          "zones": {
                            "description": "Zones is a list of zone names to use for failover if the primary zone is unavailable",
                            "items": {
                              "type": "string"
                            },
                            "maxItems": 10,
                            "type": "array"
                          }
                        },
                        "type": "object"
                      }
                    },
                    "type": "object"
                  },
                  "transformation": {
                    "description": "Transformation defines optional request/response transformations for this API",
                    "properties": {
                      "request": {
                        "description": "Request defines transformations applied to incoming API requests",
                        "properties": {
                          "headers": {
                            "description": "Headers defines HTTP header modifications for requests",
                            "properties": {
                              "add": {
                                "description": "Add is a list of HTTP headers to add to the request/response",
                                "items": {
                                  "type": "string"
                                },
                                "maxItems": 5,
                                "minItems": 1,
                                "type": "array"
                              },
                              "remove": {
                                "description": "Remove is a list of HTTP header names to remove",
                                "items": {
                                  "type": "string"
                                },
                                "maxItems": 5,
                                "minItems": 1,
                                "type": "array"
                              }
                            },
                            "type": "object"
                          }
                        },
                        "type": "object"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "basePath"
                ],
                "type": "object"
              },
              "event": {
                "description": "Event defines an Event-based service subscription configuration",
                "properties": {
                  "delivery": {
                    "description": "Delivery configures how events are delivered to the subscriber",
                    "properties": {
                      "callback": {
                        "description": "Callback is the URL where events are delivered.\nRequired when type is \"callback\", must not be set for \"ServerSentEvent\".",
                        "format": "uri",
                        "type": "string"
                      },
                      "circuitBreakerOptOut": {
                        "description": "CircuitBreakerOptOut disables the circuit breaker for this subscription.",
                        "type": "boolean"
                      },
                      "enforceGetHttpRequestMethodForHealthCheck": {
                        "description": "EnforceGetHttpRequestMethodForHealthCheck forces GET for health check probes instead of HEAD.",
                        "type": "boolean"
                      },
                      "eventRetentionTime": {
                        "description": "EventRetentionTime defines how long events are retained for this subscriber.",
                        "format": "duration",
                        "type": "string"
                      },
                      "payload": {
                        "default": "Data",
                        "description": "Payload defines the event payload format.",
                        "enum": [
                          "Data",
                          "DataRef"
                        ],
                        "type": "string"
                      },
                      "redeliveriesPerSecond": {
                        "description": "RedeliveriesPerSecond limits the rate of event redeliveries.",
                        "type": "integer"
                      },
                      "retryableStatusCodes": {
                        "description": "RetryableStatusCodes defines HTTP status codes that should trigger a retry.",
                        "items": {
                          "type": "integer"
                        },
                        "type": "array"
                      },
                      "type": {
                        "default": "Callback",
                        "description": "Type defines the delivery mechanism.",
                        "enum": [
                          "Callback",
                          "ServerSentEvent"
                        ],
                        "type": "string"
                      }
                    },
                    "required": [
                      "payload",
                      "type"
                    ],
                    "type": "object",
                    "x-kubernetes-validations": [
                      {
                        "message": "callback is required for deliveryType 'Callback' and must not be set for 'ServerSentEvent'",
                        "rule": "self.type == 'Callback' ? self.callback != \"\" : !has(self.callback)"
                      }
                    ]
                  },
                  "eventType": {
                    "description": "EventType identifies the type of event to subscribe to (e.g. \"de.telekom.eni.quickstart.v1\")",
                    "minLength": 1,
                    "type": "string"
                  },
                  "scopes": {
                    "description": "Scopes selects which publisher-defined scopes to subscribe to\nMust match scope names defined on the corresponding EventExposure",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "trigger": {
                    "description": "Trigger defines subscriber-side filtering criteria for event delivery",
                    "properties": {
                      "responseFilter": {
                        "description": "ResponseFilter controls payload shaping (which fields to return).",
                        "properties": {
                          "mode": {
                            "default": "Include",
                            "description": "Mode controls whether the listed paths are included or excluded.",
                            "enum": [
                              "Include",
                              "Exclude"
                            ],
                            "type": "string"
                          },
                          "paths": {
                            "description": "Paths lists the JSON paths to include or exclude from the event payload.",
                            "items": {
                              "type": "string"
                            },
                            "type": "array"
                          }
                        },
                        "type": "object"
                      },
                      "selectionFilter": {
                        "description": "SelectionFilter controls event matching (which events to deliver).",
                        "properties": {
                          "attributes": {
                            "additionalProperties": {
                              "type": "string"
                            },
                            "description": "Attributes defines simple key-value equality matches on CloudEvents attributes.\nAll entries are AND-ed together.",
                            "type": "object"
                          },
                          "expression": {
                            "description": "Expression contains an arbitrary JSON filter expression tree\nusing logical operators (and, or) and comparisons (eq, ge, gt, le, lt, ne)\nthat is passed through to the configuration backend without structural validation.",
                            "x-kubernetes-preserve-unknown-fields": true
                          }
                        },
                        "type": "object"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "delivery",
                  "eventType"
                ],
                "type": "object"
              }
            },
            "type": "object",
            "x-kubernetes-validations": [
              {
                "message": "At least one of api or event must be specified",
                "rule": "self == null || has(self.api) || has(self.event)"
              },
              {
                "message": "Only one of api or event can be specified (XOR relationship)",
                "rule": "(has(self.api) && !has(self.event)) || (!has(self.api) && has(self.event))"
              }
            ]
          },
          "type": "array"
        },
        "zone": {
          "description": "Zone identifies the deployment zone for this Rover resource",
          "minLength": 1,
          "type": "string"
        }
      },
      "required": [
        "zone"
      ],
      "type": "object"
    },
    "status": {
      "description": "Status contains the observed state of the Rover resource",
      "properties": {
        "apiExposures": {
          "description": "ApiExposures are references to ApiExposure resources created by this Rover",
          "items": {
            "description": "ObjectRef is a reference to a Kubernetes object\nIt is similar to types.NamespacedName but has the required json tags for serialization",
            "properties": {
              "name": {
                "type": "string"
              },
              "namespace": {
                "type": "string"
              },
              "uid": {
                "description": "UID is a type that holds unique ID values, including UUIDs.  Because we\ndon't ONLY use UUIDs, this is an alias to string.  Being a type captures\nintent and helps make sure that UIDs and names do not get conflated.",
                "type": "string"
              }
            },
            "required": [
              "name",
              "namespace"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "apiSubscriptions": {
          "description": "ApiSubscriptions are references to ApiSubscription resources created by this Rover",
          "items": {
            "description": "ObjectRef is a reference to a Kubernetes object\nIt is similar to types.NamespacedName but has the required json tags for serialization",
            "properties": {
              "name": {
                "type": "string"
              },
              "namespace": {
                "type": "string"
              },
              "uid": {
                "description": "UID is a type that holds unique ID values, including UUIDs.  Because we\ndon't ONLY use UUIDs, this is an alias to string.  Being a type captures\nintent and helps make sure that UIDs and names do not get conflated.",
                "type": "string"
              }
            },
            "required": [
              "name",
              "namespace"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "application": {
          "description": "Application is a reference to the Application resource associated with this Rover",
          "properties": {
            "name": {
              "type": "string"
            },
            "namespace": {
              "type": "string"
            },
            "uid": {
              "description": "UID is a type that holds unique ID values, including UUIDs.  Because we\ndon't ONLY use UUIDs, this is an alias to string.  Being a type captures\nintent and helps make sure that UIDs and names do not get conflated.",
              "type": "string"
            }
          },
          "required": [
            "name",
            "namespace"
          ],
          "type": "object"
        },
        "conditions": {
          "description": "Conditions represent the latest available observations of the Rover's state",
          "items": {
            "description": "Condition contains details for one aspect of the current state of this API Resource.",
            "properties": {
              "lastTransitionTime": {
                "description": "lastTransitionTime is the last time the condition transitioned from one status to another.\nThis should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.",
                "format": "date-time",
                "type": "string"
              },
              "message": {
                "description": "message is a human readable message indicating details about the transition.\nThis may be an empty string.",
                "maxLength": 32768,
                "type": "string"
              },
              "observedGeneration": {
                "description": "observedGeneration represents the .metadata.generation that the condition was set based upon.\nFor instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\nwith respect to the current state of the instance.",
                "format": "int64",
                "minimum": 0,
                "type": "integer"
              },
              "reason": {
                "description": "reason contains a programmatic identifier indicating the reason for the condition's last transition.\nProducers of specific condition types may define expected values and meanings for this field,\nand whether the values are considered a guaranteed API.\nThe value should be a CamelCase string.\nThis field may not be empty.",
                "maxLength": 1024,
                "minLength": 1,
                "pattern": "^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$",
                "type": "string"
              },
              "status": {
                "description": "status of the condition, one of True, False, Unknown.",
                "enum": [
                  "True",
                  "False",
                  "Unknown"
                ],
                "type": "string"
              },
              "type": {
                "description": "type of condition in CamelCase or in foo.example.com/CamelCase.",
                "maxLength": 316,
                "pattern": "^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$",
                "type": "string"
              }
            },
            "required": [
              "lastTransitionTime",
              "message",
              "reason",
              "status",
              "type"
            ],
            "type": "object"
          },
          "type": "array",
          "x-kubernetes-list-map-keys": [
            "type"
          ],
          "x-kubernetes-list-type": "map"
        },
        "eventExposures": {
          "description": "EventExposures are references to EventExposure resources created by this Rover",
          "items": {
            "description": "ObjectRef is a reference to a Kubernetes object\nIt is similar to types.NamespacedName but has the required json tags for serialization",
            "properties": {
              "name": {
                "type": "string"
              },
              "namespace": {
                "type": "string"
              },
              "uid": {
                "description": "UID is a type that holds unique ID values, including UUIDs.  Because we\ndon't ONLY use UUIDs, this is an alias to string.  Being a type captures\nintent and helps make sure that UIDs and names do not get conflated.",
                "type": "string"
              }
            },
            "required": [
              "name",
              "namespace"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "eventSubscriptions": {
          "description": "EventSubscriptions are references to EventSubscription resources created by this Rover",
          "items": {
            "description": "ObjectRef is a reference to a Kubernetes object\nIt is similar to types.NamespacedName but has the required json tags for serialization",
            "properties": {
              "name": {
                "type": "string"
              },
              "namespace": {
                "type": "string"
              },
              "uid": {
                "description": "UID is a type that holds unique ID values, including UUIDs.  Because we\ndon't ONLY use UUIDs, this is an alias to string.  Being a type captures\nintent and helps make sure that UIDs and names do not get conflated.",
                "type": "string"
              }
            },
            "required": [
              "name",
              "namespace"
            ],
            "type": "object"
          },
          "type": "array"
        }
      },
      "type": "object"
    }
  },
  "required": [
    "spec",
    "apiVersion",
    "kind",
    "metadata"
  ],
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://telekom.github.io/controlplane/schemas/rover.cp.ei.telekom.de/rover_v1.json",
  "title": "Rover"
}
