{
    "description": "OpenstackProviderSpec is the type that will be embedded in a Machine.Spec.ProviderSpec field for an OpenStack Instance. It is used by the Openstack machine actuator to create a single machine instance. Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.",
    "properties": {
        "additionalBlockDevices": {
            "description": "additionalBlockDevices is a list of specifications for additional block devices to attach to the server instance",
            "items": {
                "description": "additionalBlockDevice is a block device to attach to the server.",
                "properties": {
                    "name": {
                        "description": "name of the block device in the context of a machine. If the block device is a volume, the Cinder volume will be named as a combination of the machine name and this name. Also, this name will be used for tagging the block device. Information about the block device tag can be obtained from the OpenStack metadata API or the config drive.",
                        "type": "string"
                    },
                    "sizeGiB": {
                        "description": "sizeGiB is the size of the block device in gibibytes (GiB).",
                        "type": "integer"
                    },
                    "storage": {
                        "description": "storage specifies the storage type of the block device and additional storage options.",
                        "properties": {
                            "type": {
                                "description": "type is the type of block device to create. This can be either \"Volume\" or \"Local\".",
                                "type": "string"
                            },
                            "volume": {
                                "description": "volume contains additional storage options for a volume block device.",
                                "properties": {
                                    "availabilityZone": {
                                        "description": "availabilityZone is the volume availability zone to create the volume in. If omitted, the availability zone of the server will be used. The availability zone must NOT contain spaces otherwise it will lead to volume that belongs to this availability zone register failure, see kubernetes/cloud-provider-openstack#1379 for further information.",
                                        "type": "string"
                                    },
                                    "type": {
                                        "description": "type is the Cinder volume type of the volume. If omitted, the default Cinder volume type that is configured in the OpenStack cloud will be used.",
                                        "type": "string"
                                    }
                                },
                                "type": "object",
                                "additionalProperties": false
                            }
                        },
                        "required": [
                            "type"
                        ],
                        "type": "object",
                        "additionalProperties": false
                    }
                },
                "required": [
                    "name",
                    "sizeGiB",
                    "storage"
                ],
                "type": "object",
                "additionalProperties": false
            },
            "type": "array",
            "x-kubernetes-list-map-keys": [
                "name"
            ],
            "x-kubernetes-list-type": "map"
        },
        "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"
        },
        "availabilityZone": {
            "description": "The availability zone from which to launch the server.",
            "type": "string"
        },
        "cloudName": {
            "description": "The name of the cloud to use from the clouds secret",
            "type": "string"
        },
        "cloudsSecret": {
            "description": "The name of the secret containing the openstack credentials",
            "properties": {
                "name": {
                    "description": "name is unique within a namespace to reference a secret resource.",
                    "type": "string"
                },
                "namespace": {
                    "description": "namespace defines the space within which the secret name must be unique.",
                    "type": "string"
                }
            },
            "type": "object",
            "additionalProperties": false
        },
        "configDrive": {
            "description": "Config Drive support",
            "type": "boolean"
        },
        "flavor": {
            "description": "The flavor reference for the flavor for your server instance.",
            "type": "string"
        },
        "floatingIP": {
            "description": "floatingIP specifies a floating IP to be associated with the machine. Note that it is not safe to use this parameter in a MachineSet, as only one Machine may be assigned the same floating IP. \n Deprecated: floatingIP will be removed in a future release as it cannot be implemented correctly.",
            "type": "string"
        },
        "image": {
            "description": "The name of the image to use for your server instance. If the RootVolume is specified, this will be ignored and use rootVolume directly.",
            "type": "string"
        },
        "keyName": {
            "description": "The ssh key to inject in the instance",
            "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"
        },
        "networks": {
            "description": "A networks object. Required parameter when there are multiple networks defined for the tenant. When you do not specify the networks parameter, the server attaches to the only network created for the current tenant.",
            "items": {
                "properties": {
                    "filter": {
                        "description": "Filters for optional network query",
                        "properties": {
                            "adminStateUp": {
                                "description": "Deprecated: adminStateUp is silently ignored. It has no replacement.",
                                "type": "boolean"
                            },
                            "description": {
                                "description": "description filters networks by description.",
                                "type": "string"
                            },
                            "id": {
                                "description": "Deprecated: use NetworkParam.uuid instead. Ignored if NetworkParam.uuid is set.",
                                "type": "string"
                            },
                            "limit": {
                                "description": "Deprecated: limit is silently ignored. It has no replacement.",
                                "type": "integer"
                            },
                            "marker": {
                                "description": "Deprecated: marker is silently ignored. It has no replacement.",
                                "type": "string"
                            },
                            "name": {
                                "description": "name filters networks by name.",
                                "type": "string"
                            },
                            "notTags": {
                                "description": "notTags filters by networks which don't match all specified tags. NOT (t1 AND t2...) Multiple tags are comma separated.",
                                "type": "string"
                            },
                            "notTagsAny": {
                                "description": "notTagsAny filters by networks which don't match any specified tags. NOT (t1 OR t2...) Multiple tags are comma separated.",
                                "type": "string"
                            },
                            "projectId": {
                                "description": "projectId filters networks by project ID.",
                                "type": "string"
                            },
                            "shared": {
                                "description": "Deprecated: shared is silently ignored. It has no replacement.",
                                "type": "boolean"
                            },
                            "sortDir": {
                                "description": "Deprecated: sortDir is silently ignored. It has no replacement.",
                                "type": "string"
                            },
                            "sortKey": {
                                "description": "Deprecated: sortKey is silently ignored. It has no replacement.",
                                "type": "string"
                            },
                            "status": {
                                "description": "Deprecated: status is silently ignored. It has no replacement.",
                                "type": "string"
                            },
                            "tags": {
                                "description": "tags filters by networks containing all specified tags. Multiple tags are comma separated.",
                                "type": "string"
                            },
                            "tagsAny": {
                                "description": "tagsAny filters by networks containing any specified tags. Multiple tags are comma separated.",
                                "type": "string"
                            },
                            "tenantId": {
                                "description": "tenantId filters networks by tenant ID. Deprecated: use projectId instead. tenantId will be ignored if projectId is set.",
                                "type": "string"
                            }
                        },
                        "type": "object",
                        "additionalProperties": false
                    },
                    "fixedIp": {
                        "description": "A fixed IPv4 address for the NIC.",
                        "type": "string"
                    },
                    "noAllowedAddressPairs": {
                        "description": "NoAllowedAddressPairs disables creation of allowed address pairs for the network ports",
                        "type": "boolean"
                    },
                    "portSecurity": {
                        "description": "PortSecurity optionally enables or disables security on ports managed by OpenStack",
                        "type": "boolean"
                    },
                    "portTags": {
                        "description": "PortTags allows users to specify a list of tags to add to ports created in a given network",
                        "items": {
                            "type": "string"
                        },
                        "type": "array"
                    },
                    "profile": {
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "A dictionary that enables the application running on the specified host to pass and receive virtual network interface (VIF) port-specific information to the plug-in.",
                        "type": "object"
                    },
                    "subnets": {
                        "description": "Subnet within a network to use",
                        "items": {
                            "properties": {
                                "filter": {
                                    "description": "Filters for optional network query",
                                    "properties": {
                                        "cidr": {
                                            "description": "cidr filters subnets by CIDR.",
                                            "type": "string"
                                        },
                                        "description": {
                                            "description": "description filters subnets by description.",
                                            "type": "string"
                                        },
                                        "enableDhcp": {
                                            "description": "Deprecated: enableDhcp is silently ignored. It has no replacement.",
                                            "type": "boolean"
                                        },
                                        "gateway_ip": {
                                            "description": "gateway_ip filters subnets by gateway IP.",
                                            "type": "string"
                                        },
                                        "id": {
                                            "description": "id is the uuid of a specific subnet to use. If specified, id will not be validated. Instead server creation will fail with an appropriate error.",
                                            "type": "string"
                                        },
                                        "ipVersion": {
                                            "description": "ipVersion filters subnets by IP version.",
                                            "type": "integer"
                                        },
                                        "ipv6AddressMode": {
                                            "description": "ipv6AddressMode filters subnets by IPv6 address mode.",
                                            "type": "string"
                                        },
                                        "ipv6RaMode": {
                                            "description": "ipv6RaMode filters subnets by IPv6 router adversiement mode.",
                                            "type": "string"
                                        },
                                        "limit": {
                                            "description": "Deprecated: limit is silently ignored. It has no replacement.",
                                            "type": "integer"
                                        },
                                        "marker": {
                                            "description": "Deprecated: marker is silently ignored. It has no replacement.",
                                            "type": "string"
                                        },
                                        "name": {
                                            "description": "name filters subnets by name.",
                                            "type": "string"
                                        },
                                        "networkId": {
                                            "description": "Deprecated: networkId is silently ignored. Set uuid on the containing network definition instead.",
                                            "type": "string"
                                        },
                                        "notTags": {
                                            "description": "notTags filters by subnets which don't match all specified tags. NOT (t1 AND t2...) Multiple tags are comma separated.",
                                            "type": "string"
                                        },
                                        "notTagsAny": {
                                            "description": "notTagsAny filters by subnets which don't match any specified tags. NOT (t1 OR t2...) Multiple tags are comma separated.",
                                            "type": "string"
                                        },
                                        "projectId": {
                                            "description": "projectId filters subnets by project ID.",
                                            "type": "string"
                                        },
                                        "sortDir": {
                                            "description": "Deprecated: sortDir is silently ignored. It has no replacement.",
                                            "type": "string"
                                        },
                                        "sortKey": {
                                            "description": "Deprecated: sortKey is silently ignored. It has no replacement.",
                                            "type": "string"
                                        },
                                        "subnetpoolId": {
                                            "description": "subnetpoolId filters subnets by subnet pool ID.",
                                            "type": "string"
                                        },
                                        "tags": {
                                            "description": "tags filters by subnets containing all specified tags. Multiple tags are comma separated.",
                                            "type": "string"
                                        },
                                        "tagsAny": {
                                            "description": "tagsAny filters by subnets containing any specified tags. Multiple tags are comma separated.",
                                            "type": "string"
                                        },
                                        "tenantId": {
                                            "description": "tenantId filters subnets by tenant ID. Deprecated: use projectId instead. tenantId will be ignored if projectId is set.",
                                            "type": "string"
                                        }
                                    },
                                    "type": "object",
                                    "additionalProperties": false
                                },
                                "portSecurity": {
                                    "description": "PortSecurity optionally enables or disables security on ports managed by OpenStack",
                                    "type": "boolean"
                                },
                                "portTags": {
                                    "description": "PortTags are tags that are added to ports created on this subnet",
                                    "items": {
                                        "type": "string"
                                    },
                                    "type": "array"
                                },
                                "uuid": {
                                    "description": "The UUID of the network. Required if you omit the port attribute.",
                                    "type": "string"
                                }
                            },
                            "type": "object",
                            "additionalProperties": false
                        },
                        "type": "array"
                    },
                    "uuid": {
                        "description": "The UUID of the network. Required if you omit the port attribute.",
                        "type": "string"
                    },
                    "vnicType": {
                        "description": "The virtual network interface card (vNIC) type that is bound to the neutron port.",
                        "type": "string"
                    }
                },
                "type": "object",
                "additionalProperties": false
            },
            "type": "array"
        },
        "ports": {
            "description": "Create and assign additional ports to instances",
            "items": {
                "properties": {
                    "adminStateUp": {
                        "description": "adminStateUp sets the administrative state of the created port to up (true), or down (false).",
                        "type": "boolean"
                    },
                    "allowedAddressPairs": {
                        "description": "allowedAddressPairs specifies a set of allowed address pairs to add to the port.",
                        "items": {
                            "properties": {
                                "ipAddress": {
                                    "type": "string"
                                },
                                "macAddress": {
                                    "type": "string"
                                }
                            },
                            "type": "object",
                            "additionalProperties": false
                        },
                        "type": "array"
                    },
                    "description": {
                        "description": "description specifies the description of the created port.",
                        "type": "string"
                    },
                    "fixedIPs": {
                        "description": "fixedIPs specifies a set of fixed IPs to assign to the port. They must all be valid for the port's network.",
                        "items": {
                            "properties": {
                                "ipAddress": {
                                    "description": "ipAddress is a specific IP address to use in the given subnet. Port creation will fail if the address is not available. If not specified, an available IP from the given subnet will be selected automatically.",
                                    "type": "string"
                                },
                                "subnetID": {
                                    "description": "subnetID specifies the ID of the subnet where the fixed IP will be allocated.",
                                    "type": "string"
                                }
                            },
                            "type": "object",
                            "additionalProperties": false
                        },
                        "type": "array"
                    },
                    "hostID": {
                        "description": "The ID of the host where the port is allocated. Do not use this field: it cannot be used correctly. Deprecated: hostID is silently ignored. It will be removed with no replacement.",
                        "type": "string"
                    },
                    "macAddress": {
                        "description": "macAddress specifies the MAC address of the created port.",
                        "type": "string"
                    },
                    "nameSuffix": {
                        "description": "If nameSuffix is specified the created port will be named <machine name>-<nameSuffix>. If not specified the port will be named <machine-name>-<index of this port>.",
                        "type": "string"
                    },
                    "networkID": {
                        "description": "networkID is the ID of the network the port will be created in. It is required.",
                        "type": "string"
                    },
                    "portSecurity": {
                        "description": "enable or disable security on a given port incompatible with securityGroups and allowedAddressPairs",
                        "type": "boolean"
                    },
                    "profile": {
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "A dictionary that enables the application running on the specified host to pass and receive virtual network interface (VIF) port-specific information to the plug-in.",
                        "type": "object"
                    },
                    "projectID": {
                        "description": "projectID specifies the project ID of the created port. Note that this requires OpenShift to have administrative permissions, which is typically not the case. Use of this field is not recommended.",
                        "type": "string"
                    },
                    "securityGroups": {
                        "description": "securityGroups specifies a set of security group UUIDs to use instead of the machine's default security groups. The default security groups will be used if this is left empty or not specified.",
                        "items": {
                            "type": "string"
                        },
                        "type": "array"
                    },
                    "tags": {
                        "description": "tags species a set of tags to add to the port.",
                        "items": {
                            "type": "string"
                        },
                        "type": "array"
                    },
                    "tenantID": {
                        "description": "tenantID specifies the tenant ID of the created port. Note that this requires OpenShift to have administrative permissions, which is typically not the case. Use of this field is not recommended. Deprecated: use projectID instead. It will be ignored if projectID is set.",
                        "type": "string"
                    },
                    "trunk": {
                        "description": "Enables and disables trunk at port level. If not provided, openStackMachine.Spec.Trunk is inherited.",
                        "type": "boolean"
                    },
                    "vnicType": {
                        "description": "The virtual network interface card (vNIC) type that is bound to the neutron port.",
                        "type": "string"
                    }
                },
                "type": "object",
                "additionalProperties": false
            },
            "type": "array"
        },
        "primarySubnet": {
            "description": "The subnet that a set of machines will get ingress/egress traffic from",
            "type": "string"
        },
        "rootVolume": {
            "description": "The volume metadata to boot from",
            "properties": {
                "availabilityZone": {
                    "description": "availabilityZone specifies the Cinder availability where the root volume will be created.",
                    "type": "string"
                },
                "deviceType": {
                    "description": "Deprecated: deviceType will be silently ignored. There is no replacement.",
                    "type": "string"
                },
                "diskSize": {
                    "description": "diskSize specifies the size, in GB, of the created root volume.",
                    "type": "integer"
                },
                "sourceType": {
                    "description": "Deprecated: sourceType will be silently ignored. There is no replacement.",
                    "type": "string"
                },
                "sourceUUID": {
                    "description": "sourceUUID specifies the UUID of a glance image used to populate the root volume. Deprecated: set image in the platform spec instead. This will be ignored if image is set in the platform spec.",
                    "type": "string"
                },
                "volumeType": {
                    "description": "volumeType specifies a volume type to use when creating the root volume. If not specified the default volume type will be used.",
                    "type": "string"
                }
            },
            "type": "object",
            "additionalProperties": false
        },
        "securityGroups": {
            "description": "The names of the security groups to assign to the instance",
            "items": {
                "properties": {
                    "filter": {
                        "description": "Filters used to query security groups in openstack",
                        "properties": {
                            "description": {
                                "description": "description filters security groups by description.",
                                "type": "string"
                            },
                            "id": {
                                "description": "id specifies the ID of a security group to use. If set, id will not be validated before use. An invalid id will result in failure to create a server with an appropriate error message.",
                                "type": "string"
                            },
                            "limit": {
                                "description": "Deprecated: limit is silently ignored. It has no replacement.",
                                "type": "integer"
                            },
                            "marker": {
                                "description": "Deprecated: marker is silently ignored. It has no replacement.",
                                "type": "string"
                            },
                            "name": {
                                "description": "name filters security groups by name.",
                                "type": "string"
                            },
                            "notTags": {
                                "description": "notTags filters by security groups which don't match all specified tags. NOT (t1 AND t2...) Multiple tags are comma separated.",
                                "type": "string"
                            },
                            "notTagsAny": {
                                "description": "notTagsAny filters by security groups which don't match any specified tags. NOT (t1 OR t2...) Multiple tags are comma separated.",
                                "type": "string"
                            },
                            "projectId": {
                                "description": "projectId filters security groups by project ID.",
                                "type": "string"
                            },
                            "sortDir": {
                                "description": "Deprecated: sortDir is silently ignored. It has no replacement.",
                                "type": "string"
                            },
                            "sortKey": {
                                "description": "Deprecated: sortKey is silently ignored. It has no replacement.",
                                "type": "string"
                            },
                            "tags": {
                                "description": "tags filters by security groups containing all specified tags. Multiple tags are comma separated.",
                                "type": "string"
                            },
                            "tagsAny": {
                                "description": "tagsAny filters by security groups containing any specified tags. Multiple tags are comma separated.",
                                "type": "string"
                            },
                            "tenantId": {
                                "description": "tenantId filters security groups by tenant ID. Deprecated: use projectId instead. tenantId will be ignored if projectId is set.",
                                "type": "string"
                            }
                        },
                        "type": "object",
                        "additionalProperties": false
                    },
                    "name": {
                        "description": "Security Group name",
                        "type": "string"
                    },
                    "uuid": {
                        "description": "Security Group UUID",
                        "type": "string"
                    }
                },
                "type": "object",
                "additionalProperties": false
            },
            "type": "array"
        },
        "serverGroupID": {
            "description": "The server group to assign the machine to.",
            "type": "string"
        },
        "serverGroupName": {
            "description": "The server group to assign the machine to. A server group with that name will be created if it does not exist. If both ServerGroupID and ServerGroupName are non-empty, they must refer to the same OpenStack resource.",
            "type": "string"
        },
        "serverMetadata": {
            "additionalProperties": {
                "type": "string"
            },
            "description": "Metadata mapping. Allows you to create a map of key value pairs to add to the server instance.",
            "type": "object"
        },
        "sshUserName": {
            "description": "The machine ssh username",
            "type": "string"
        },
        "tags": {
            "description": "Machine tags Requires Nova api 2.52 minimum!",
            "items": {
                "type": "string"
            },
            "type": "array"
        },
        "trunk": {
            "description": "Whether the server instance is created on a trunk port or not.",
            "type": "boolean"
        },
        "userDataSecret": {
            "description": "The name of the secret containing the user data (startup script in most cases)",
            "properties": {
                "name": {
                    "description": "name is unique within a namespace to reference a secret resource.",
                    "type": "string"
                },
                "namespace": {
                    "description": "namespace defines the space within which the secret name must be unique.",
                    "type": "string"
                }
            },
            "type": "object",
            "additionalProperties": false
        }
    },
    "type": "object",
    "additionalProperties": false,
    "$schema": "http://json-schema.org/draft-04/schema#"
}
