{
  "description": "AzureCluster is the Schema for the azureclusters API",
  "properties": {
    "apiVersion": {
      "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
      "type": "string"
    },
    "kind": {
      "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
      "type": "string"
    },
    "metadata": {
      "type": "object"
    },
    "spec": {
      "description": "AzureClusterSpec defines the desired state of AzureCluster",
      "properties": {
        "additionalTags": {
          "additionalProperties": {
            "type": "string"
          },
          "description": "AdditionalTags is an optional set of tags to add to Azure resources managed by the Azure provider, in addition to the ones added by default.",
          "type": "object"
        },
        "location": {
          "type": "string"
        },
        "networkSpec": {
          "description": "NetworkSpec encapsulates all things related to Azure network.",
          "properties": {
            "subnets": {
              "description": "Subnets is the configuration for the control-plane subnet and the node subnet.",
              "items": {
                "description": "SubnetSpec configures an Azure subnet.",
                "properties": {
                  "cidrBlock": {
                    "description": "CidrBlock is the CIDR block to be used when the provider creates a managed Vnet.",
                    "type": "string"
                  },
                  "id": {
                    "description": "ID defines a unique identifier to reference this resource.",
                    "type": "string"
                  },
                  "internalLBIPAddress": {
                    "description": "InternalLBIPAddress is the IP address that will be used as the internal LB private IP. For the control plane subnet only.",
                    "type": "string"
                  },
                  "name": {
                    "description": "Name defines a name for the subnet resource.",
                    "type": "string"
                  },
                  "role": {
                    "description": "Role defines the subnet role (eg. Node, ControlPlane)",
                    "type": "string"
                  },
                  "securityGroup": {
                    "description": "SecurityGroup defines the NSG (network security group) that should be attached to this subnet.",
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "ingressRule": {
                        "description": "IngressRules is a slice of Azure ingress rules for security groups.",
                        "items": {
                          "description": "IngressRule defines an Azure ingress rule for security groups.",
                          "properties": {
                            "description": {
                              "type": "string"
                            },
                            "destination": {
                              "description": "Destination - The destination address prefix. CIDR or destination IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used.",
                              "type": "string"
                            },
                            "destinationPorts": {
                              "description": "DestinationPorts - The destination port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports.",
                              "type": "string"
                            },
                            "protocol": {
                              "description": "SecurityGroupProtocol defines the protocol type for a security group rule.",
                              "type": "string"
                            },
                            "source": {
                              "description": "Source - The CIDR or source IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. If this is an ingress rule, specifies where network traffic originates from.",
                              "type": "string"
                            },
                            "sourcePorts": {
                              "description": "SourcePorts - The source port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports.",
                              "type": "string"
                            }
                          },
                          "required": [
                            "description",
                            "protocol"
                          ],
                          "type": "object",
                          "additionalProperties": false
                        },
                        "type": "array"
                      },
                      "name": {
                        "type": "string"
                      },
                      "tags": {
                        "additionalProperties": {
                          "type": "string"
                        },
                        "description": "Tags defines a map of tags.",
                        "type": "object"
                      }
                    },
                    "type": "object",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "name"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            },
            "vnet": {
              "description": "Vnet is the configuration for the Azure virtual network.",
              "properties": {
                "cidrBlock": {
                  "description": "CidrBlock is the CIDR block to be used when the provider creates a managed virtual network.",
                  "type": "string"
                },
                "id": {
                  "description": "ID is the identifier of the virtual network this provider should use to create resources.",
                  "type": "string"
                },
                "name": {
                  "description": "Name defines a name for the virtual network resource.",
                  "type": "string"
                },
                "resourceGroup": {
                  "description": "ResourceGroup is the name of the resource group of the existing virtual network or the resource group where a managed virtual network should be created.",
                  "type": "string"
                },
                "tags": {
                  "additionalProperties": {
                    "type": "string"
                  },
                  "description": "Tags is a collection of tags describing the resource.",
                  "type": "object"
                }
              },
              "required": [
                "name"
              ],
              "type": "object",
              "additionalProperties": false
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "resourceGroup": {
          "type": "string"
        }
      },
      "required": [
        "location",
        "resourceGroup"
      ],
      "type": "object",
      "additionalProperties": false
    },
    "status": {
      "description": "AzureClusterStatus defines the observed state of AzureCluster",
      "properties": {
        "apiEndpoints": {
          "description": "APIEndpoints represents the endpoints to communicate with the control plane.",
          "items": {
            "description": "APIEndpoint represents a reachable Kubernetes API endpoint.",
            "properties": {
              "host": {
                "description": "The hostname on which the API server is serving.",
                "type": "string"
              },
              "port": {
                "description": "The port on which the API server is serving.",
                "type": "integer"
              }
            },
            "required": [
              "host",
              "port"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        },
        "bastion": {
          "description": "VM describes an Azure virtual machine.",
          "properties": {
            "addresses": {
              "description": "Addresses contains the Azure instance associated addresses.",
              "items": {
                "description": "NodeAddress contains information for the node's address.",
                "properties": {
                  "address": {
                    "description": "The node address.",
                    "type": "string"
                  },
                  "type": {
                    "description": "Node address type, one of Hostname, ExternalIP or InternalIP.",
                    "type": "string"
                  }
                },
                "required": [
                  "address",
                  "type"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            },
            "availabilityZone": {
              "type": "string"
            },
            "id": {
              "type": "string"
            },
            "identity": {
              "description": "VMIdentity defines the identity of the virtual machine, if configured.",
              "type": "string"
            },
            "image": {
              "description": "Storage profile",
              "properties": {
                "gallery": {
                  "type": "string"
                },
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "offer": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "resourceGroup": {
                  "type": "string"
                },
                "sku": {
                  "type": "string"
                },
                "subscriptionID": {
                  "type": "string"
                },
                "version": {
                  "type": "string"
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "name": {
              "type": "string"
            },
            "osDisk": {
              "properties": {
                "diskSizeGB": {
                  "format": "int32",
                  "type": "integer"
                },
                "managedDisk": {
                  "properties": {
                    "storageAccountType": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "storageAccountType"
                  ],
                  "type": "object",
                  "additionalProperties": false
                },
                "osType": {
                  "type": "string"
                }
              },
              "required": [
                "diskSizeGB",
                "managedDisk",
                "osType"
              ],
              "type": "object",
              "additionalProperties": false
            },
            "startupScript": {
              "type": "string"
            },
            "tags": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "Tags defines a map of tags.",
              "type": "object"
            },
            "vmSize": {
              "description": "Hardware profile",
              "type": "string"
            },
            "vmState": {
              "description": "State - The provisioning state, which only appears in the response.",
              "type": "string"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "network": {
          "description": "Network encapsulates Azure networking resources.",
          "properties": {
            "apiServerIp": {
              "description": "APIServerIP is the Kubernetes API server public IP address.",
              "properties": {
                "dnsName": {
                  "type": "string"
                },
                "id": {
                  "type": "string"
                },
                "ipAddress": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "apiServerLb": {
              "description": "APIServerLB is the Kubernetes API server load balancer.",
              "properties": {
                "backendPool": {
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                },
                "frontendIpConfig": {
                  "type": "object"
                },
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "sku": {
                  "description": "LoadBalancerSKU enumerates the values for load balancer sku name.",
                  "type": "string"
                },
                "tags": {
                  "additionalProperties": {
                    "type": "string"
                  },
                  "description": "Tags defines a map of tags.",
                  "type": "object"
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "securityGroups": {
              "additionalProperties": {
                "description": "SecurityGroup defines an Azure security group.",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "ingressRule": {
                    "description": "IngressRules is a slice of Azure ingress rules for security groups.",
                    "items": {
                      "description": "IngressRule defines an Azure ingress rule for security groups.",
                      "properties": {
                        "description": {
                          "type": "string"
                        },
                        "destination": {
                          "description": "Destination - The destination address prefix. CIDR or destination IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used.",
                          "type": "string"
                        },
                        "destinationPorts": {
                          "description": "DestinationPorts - The destination port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports.",
                          "type": "string"
                        },
                        "protocol": {
                          "description": "SecurityGroupProtocol defines the protocol type for a security group rule.",
                          "type": "string"
                        },
                        "source": {
                          "description": "Source - The CIDR or source IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. If this is an ingress rule, specifies where network traffic originates from.",
                          "type": "string"
                        },
                        "sourcePorts": {
                          "description": "SourcePorts - The source port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports.",
                          "type": "string"
                        }
                      },
                      "required": [
                        "description",
                        "protocol"
                      ],
                      "type": "object",
                      "additionalProperties": false
                    },
                    "type": "array"
                  },
                  "name": {
                    "type": "string"
                  },
                  "tags": {
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Tags defines a map of tags.",
                    "type": "object"
                  }
                },
                "type": "object",
                "additionalProperties": false
              },
              "description": "SecurityGroups is a map from the role/kind of the security group to its unique name, if any.",
              "type": "object"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "ready": {
          "description": "Ready is true when the provider resource is ready.",
          "type": "boolean"
        }
      },
      "type": "object",
      "additionalProperties": false
    }
  },
  "type": "object"
}
