// Code generated by azure-service-operator-codegen. DO NOT EDIT.
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
package storage

import (
	"github.com/Azure/azure-service-operator/v2/pkg/genruntime"
	"github.com/Azure/azure-service-operator/v2/pkg/genruntime/conditions"
	"github.com/Azure/azure-service-operator/v2/pkg/genruntime/configmaps"
	"github.com/Azure/azure-service-operator/v2/pkg/genruntime/core"
	"github.com/Azure/azure-service-operator/v2/pkg/genruntime/secrets"
	"github.com/rotisserie/eris"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime/schema"
)

// +kubebuilder:rbac:groups=network.azure.com,resources=virtualnetworkgateways,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=network.azure.com,resources={virtualnetworkgateways/status,virtualnetworkgateways/finalizers},verbs=get;update;patch

// +kubebuilder:object:root=true
// +kubebuilder:resource:categories={azure,network}
// +kubebuilder:subresource:status
// +kubebuilder:storageversion
// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].status"
// +kubebuilder:printcolumn:name="Severity",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].severity"
// +kubebuilder:printcolumn:name="Reason",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].reason"
// +kubebuilder:printcolumn:name="Message",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].message"
// Storage version of v1api20240301.VirtualNetworkGateway
// Generator information:
// - Generated from: /network/resource-manager/Microsoft.Network/stable/2024-03-01/virtualNetworkGateway.json
// - ARM URI: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/virtualNetworkGateways/{virtualNetworkGatewayName}
type VirtualNetworkGateway struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`
	Spec              VirtualNetworkGateway_Spec   `json:"spec,omitempty"`
	Status            VirtualNetworkGateway_STATUS `json:"status,omitempty"`
}

var _ conditions.Conditioner = &VirtualNetworkGateway{}

// GetConditions returns the conditions of the resource
func (gateway *VirtualNetworkGateway) GetConditions() conditions.Conditions {
	return gateway.Status.Conditions
}

// SetConditions sets the conditions on the resource status
func (gateway *VirtualNetworkGateway) SetConditions(conditions conditions.Conditions) {
	gateway.Status.Conditions = conditions
}

var _ configmaps.Exporter = &VirtualNetworkGateway{}

// ConfigMapDestinationExpressions returns the Spec.OperatorSpec.ConfigMapExpressions property
func (gateway *VirtualNetworkGateway) ConfigMapDestinationExpressions() []*core.DestinationExpression {
	if gateway.Spec.OperatorSpec == nil {
		return nil
	}
	return gateway.Spec.OperatorSpec.ConfigMapExpressions
}

var _ secrets.Exporter = &VirtualNetworkGateway{}

// SecretDestinationExpressions returns the Spec.OperatorSpec.SecretExpressions property
func (gateway *VirtualNetworkGateway) SecretDestinationExpressions() []*core.DestinationExpression {
	if gateway.Spec.OperatorSpec == nil {
		return nil
	}
	return gateway.Spec.OperatorSpec.SecretExpressions
}

var _ genruntime.KubernetesResource = &VirtualNetworkGateway{}

// AzureName returns the Azure name of the resource
func (gateway *VirtualNetworkGateway) AzureName() string {
	return gateway.Spec.AzureName
}

// GetAPIVersion returns the ARM API version of the resource. This is always "2024-03-01"
func (gateway VirtualNetworkGateway) GetAPIVersion() string {
	return "2024-03-01"
}

// GetResourceScope returns the scope of the resource
func (gateway *VirtualNetworkGateway) GetResourceScope() genruntime.ResourceScope {
	return genruntime.ResourceScopeResourceGroup
}

// GetSpec returns the specification of this resource
func (gateway *VirtualNetworkGateway) GetSpec() genruntime.ConvertibleSpec {
	return &gateway.Spec
}

// GetStatus returns the status of this resource
func (gateway *VirtualNetworkGateway) GetStatus() genruntime.ConvertibleStatus {
	return &gateway.Status
}

// GetSupportedOperations returns the operations supported by the resource
func (gateway *VirtualNetworkGateway) GetSupportedOperations() []genruntime.ResourceOperation {
	return []genruntime.ResourceOperation{
		genruntime.ResourceOperationDelete,
		genruntime.ResourceOperationGet,
		genruntime.ResourceOperationPut,
	}
}

// GetType returns the ARM Type of the resource. This is always "Microsoft.Network/virtualNetworkGateways"
func (gateway *VirtualNetworkGateway) GetType() string {
	return "Microsoft.Network/virtualNetworkGateways"
}

// NewEmptyStatus returns a new empty (blank) status
func (gateway *VirtualNetworkGateway) NewEmptyStatus() genruntime.ConvertibleStatus {
	return &VirtualNetworkGateway_STATUS{}
}

// Owner returns the ResourceReference of the owner
func (gateway *VirtualNetworkGateway) Owner() *genruntime.ResourceReference {
	if gateway.Spec.Owner == nil {
		return nil
	}

	group, kind := genruntime.LookupOwnerGroupKind(gateway.Spec)
	return gateway.Spec.Owner.AsResourceReference(group, kind)
}

// SetStatus sets the status of this resource
func (gateway *VirtualNetworkGateway) SetStatus(status genruntime.ConvertibleStatus) error {
	// If we have exactly the right type of status, assign it
	if st, ok := status.(*VirtualNetworkGateway_STATUS); ok {
		gateway.Status = *st
		return nil
	}

	// Convert status to required version
	var st VirtualNetworkGateway_STATUS
	err := status.ConvertStatusTo(&st)
	if err != nil {
		return eris.Wrap(err, "failed to convert status")
	}

	gateway.Status = st
	return nil
}

// Hub marks that this VirtualNetworkGateway is the hub type for conversion
func (gateway *VirtualNetworkGateway) Hub() {}

// OriginalGVK returns a GroupValueKind for the original API version used to create the resource
func (gateway *VirtualNetworkGateway) OriginalGVK() *schema.GroupVersionKind {
	return &schema.GroupVersionKind{
		Group:   GroupVersion.Group,
		Version: gateway.Spec.OriginalVersion,
		Kind:    "VirtualNetworkGateway",
	}
}

// +kubebuilder:object:root=true
// Storage version of v1api20240301.VirtualNetworkGateway
// Generator information:
// - Generated from: /network/resource-manager/Microsoft.Network/stable/2024-03-01/virtualNetworkGateway.json
// - ARM URI: /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/virtualNetworkGateways/{virtualNetworkGatewayName}
type VirtualNetworkGatewayList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []VirtualNetworkGateway `json:"items"`
}

// Storage version of v1api20240301.VirtualNetworkGateway_Spec
type VirtualNetworkGateway_Spec struct {
	ActiveActive           *bool                                        `json:"activeActive,omitempty"`
	AdminState             *string                                      `json:"adminState,omitempty"`
	AllowRemoteVnetTraffic *bool                                        `json:"allowRemoteVnetTraffic,omitempty"`
	AllowVirtualWanTraffic *bool                                        `json:"allowVirtualWanTraffic,omitempty"`
	AutoScaleConfiguration *VirtualNetworkGatewayAutoScaleConfiguration `json:"autoScaleConfiguration,omitempty"`

	// AzureName: The name of the resource in Azure. This is often the same as the name of the resource in Kubernetes but it
	// doesn't have to be.
	AzureName                       string                                 `json:"azureName,omitempty"`
	BgpSettings                     *BgpSettings                           `json:"bgpSettings,omitempty"`
	CustomRoutes                    *AddressSpace                          `json:"customRoutes,omitempty"`
	DisableIPSecReplayProtection    *bool                                  `json:"disableIPSecReplayProtection,omitempty"`
	EnableBgp                       *bool                                  `json:"enableBgp,omitempty"`
	EnableBgpRouteTranslationForNat *bool                                  `json:"enableBgpRouteTranslationForNat,omitempty"`
	EnableDnsForwarding             *bool                                  `json:"enableDnsForwarding,omitempty"`
	EnablePrivateIpAddress          *bool                                  `json:"enablePrivateIpAddress,omitempty"`
	ExtendedLocation                *ExtendedLocation                      `json:"extendedLocation,omitempty"`
	GatewayDefaultSite              *SubResource                           `json:"gatewayDefaultSite,omitempty"`
	GatewayType                     *string                                `json:"gatewayType,omitempty"`
	Identity                        *ManagedServiceIdentity                `json:"identity,omitempty"`
	IpConfigurations                []VirtualNetworkGatewayIPConfiguration `json:"ipConfigurations,omitempty"`
	Location                        *string                                `json:"location,omitempty"`
	NatRules                        []VirtualNetworkGatewayNatRule         `json:"natRules,omitempty"`
	OperatorSpec                    *VirtualNetworkGatewayOperatorSpec     `json:"operatorSpec,omitempty"`
	OriginalVersion                 string                                 `json:"originalVersion,omitempty"`

	// +kubebuilder:validation:Required
	// Owner: The owner of the resource. The owner controls where the resource goes when it is deployed. The owner also
	// controls the resources lifecycle. When the owner is deleted the resource will also be deleted. Owner is expected to be a
	// reference to a resources.azure.com/ResourceGroup resource
	Owner           *genruntime.KnownResourceReference `group:"resources.azure.com" json:"owner,omitempty" kind:"ResourceGroup"`
	PropertyBag     genruntime.PropertyBag             `json:"$propertyBag,omitempty"`
	ResiliencyModel *string                            `json:"resiliencyModel,omitempty"`
	Sku             *VirtualNetworkGatewaySku          `json:"sku,omitempty"`
	Tags            map[string]string                  `json:"tags,omitempty"`

	// VNetExtendedLocationResourceReference: Customer vnet resource id. VirtualNetworkGateway of type local gateway is
	// associated with the customer vnet.
	VNetExtendedLocationResourceReference *genruntime.ResourceReference      `armReference:"VNetExtendedLocationResourceId" json:"vNetExtendedLocationResourceReference,omitempty"`
	VirtualNetworkGatewayPolicyGroups     []VirtualNetworkGatewayPolicyGroup `json:"virtualNetworkGatewayPolicyGroups,omitempty"`
	VpnClientConfiguration                *VpnClientConfiguration            `json:"vpnClientConfiguration,omitempty"`
	VpnGatewayGeneration                  *string                            `json:"vpnGatewayGeneration,omitempty"`
	VpnType                               *string                            `json:"vpnType,omitempty"`
}

var _ genruntime.ConvertibleSpec = &VirtualNetworkGateway_Spec{}

// ConvertSpecFrom populates our VirtualNetworkGateway_Spec from the provided source
func (gateway *VirtualNetworkGateway_Spec) ConvertSpecFrom(source genruntime.ConvertibleSpec) error {
	if source == gateway {
		return eris.New("attempted conversion between unrelated implementations of github.com/Azure/azure-service-operator/v2/pkg/genruntime/ConvertibleSpec")
	}

	return source.ConvertSpecTo(gateway)
}

// ConvertSpecTo populates the provided destination from our VirtualNetworkGateway_Spec
func (gateway *VirtualNetworkGateway_Spec) ConvertSpecTo(destination genruntime.ConvertibleSpec) error {
	if destination == gateway {
		return eris.New("attempted conversion between unrelated implementations of github.com/Azure/azure-service-operator/v2/pkg/genruntime/ConvertibleSpec")
	}

	return destination.ConvertSpecFrom(gateway)
}

// Storage version of v1api20240301.VirtualNetworkGateway_STATUS
// A common class for general resource information.
type VirtualNetworkGateway_STATUS struct {
	ActiveActive                      *bool                                               `json:"activeActive,omitempty"`
	AdminState                        *string                                             `json:"adminState,omitempty"`
	AllowRemoteVnetTraffic            *bool                                               `json:"allowRemoteVnetTraffic,omitempty"`
	AllowVirtualWanTraffic            *bool                                               `json:"allowVirtualWanTraffic,omitempty"`
	AutoScaleConfiguration            *VirtualNetworkGatewayAutoScaleConfiguration_STATUS `json:"autoScaleConfiguration,omitempty"`
	BgpSettings                       *BgpSettings_STATUS                                 `json:"bgpSettings,omitempty"`
	Conditions                        []conditions.Condition                              `json:"conditions,omitempty"`
	CustomRoutes                      *AddressSpace_STATUS                                `json:"customRoutes,omitempty"`
	DisableIPSecReplayProtection      *bool                                               `json:"disableIPSecReplayProtection,omitempty"`
	EnableBgp                         *bool                                               `json:"enableBgp,omitempty"`
	EnableBgpRouteTranslationForNat   *bool                                               `json:"enableBgpRouteTranslationForNat,omitempty"`
	EnableDnsForwarding               *bool                                               `json:"enableDnsForwarding,omitempty"`
	EnablePrivateIpAddress            *bool                                               `json:"enablePrivateIpAddress,omitempty"`
	Etag                              *string                                             `json:"etag,omitempty"`
	ExtendedLocation                  *ExtendedLocation_STATUS                            `json:"extendedLocation,omitempty"`
	GatewayDefaultSite                *SubResource_STATUS                                 `json:"gatewayDefaultSite,omitempty"`
	GatewayType                       *string                                             `json:"gatewayType,omitempty"`
	Id                                *string                                             `json:"id,omitempty"`
	Identity                          *ManagedServiceIdentity_STATUS                      `json:"identity,omitempty"`
	InboundDnsForwardingEndpoint      *string                                             `json:"inboundDnsForwardingEndpoint,omitempty"`
	IpConfigurations                  []VirtualNetworkGatewayIPConfiguration_STATUS       `json:"ipConfigurations,omitempty"`
	Location                          *string                                             `json:"location,omitempty"`
	Name                              *string                                             `json:"name,omitempty"`
	NatRules                          []VirtualNetworkGatewayNatRule_STATUS               `json:"natRules,omitempty"`
	PropertyBag                       genruntime.PropertyBag                              `json:"$propertyBag,omitempty"`
	ProvisioningState                 *string                                             `json:"provisioningState,omitempty"`
	ResiliencyModel                   *string                                             `json:"resiliencyModel,omitempty"`
	ResourceGuid                      *string                                             `json:"resourceGuid,omitempty"`
	Sku                               *VirtualNetworkGatewaySku_STATUS                    `json:"sku,omitempty"`
	Tags                              map[string]string                                   `json:"tags,omitempty"`
	Type                              *string                                             `json:"type,omitempty"`
	VNetExtendedLocationResourceId    *string                                             `json:"vNetExtendedLocationResourceId,omitempty"`
	VirtualNetworkGatewayPolicyGroups []VirtualNetworkGatewayPolicyGroup_STATUS           `json:"virtualNetworkGatewayPolicyGroups,omitempty"`
	VpnClientConfiguration            *VpnClientConfiguration_STATUS                      `json:"vpnClientConfiguration,omitempty"`
	VpnGatewayGeneration              *string                                             `json:"vpnGatewayGeneration,omitempty"`
	VpnType                           *string                                             `json:"vpnType,omitempty"`
}

var _ genruntime.ConvertibleStatus = &VirtualNetworkGateway_STATUS{}

// ConvertStatusFrom populates our VirtualNetworkGateway_STATUS from the provided source
func (gateway *VirtualNetworkGateway_STATUS) ConvertStatusFrom(source genruntime.ConvertibleStatus) error {
	if source == gateway {
		return eris.New("attempted conversion between unrelated implementations of github.com/Azure/azure-service-operator/v2/pkg/genruntime/ConvertibleStatus")
	}

	return source.ConvertStatusTo(gateway)
}

// ConvertStatusTo populates the provided destination from our VirtualNetworkGateway_STATUS
func (gateway *VirtualNetworkGateway_STATUS) ConvertStatusTo(destination genruntime.ConvertibleStatus) error {
	if destination == gateway {
		return eris.New("attempted conversion between unrelated implementations of github.com/Azure/azure-service-operator/v2/pkg/genruntime/ConvertibleStatus")
	}

	return destination.ConvertStatusFrom(gateway)
}

// Storage version of v1api20240301.BgpSettings
// BGP settings details.
type BgpSettings struct {
	Asn                 *uint32                            `json:"asn,omitempty"`
	BgpPeeringAddress   *string                            `json:"bgpPeeringAddress,omitempty"`
	BgpPeeringAddresses []IPConfigurationBgpPeeringAddress `json:"bgpPeeringAddresses,omitempty"`
	PeerWeight          *int                               `json:"peerWeight,omitempty"`
	PropertyBag         genruntime.PropertyBag             `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20240301.BgpSettings_STATUS
// BGP settings details.
type BgpSettings_STATUS struct {
	Asn                 *uint32                                   `json:"asn,omitempty"`
	BgpPeeringAddress   *string                                   `json:"bgpPeeringAddress,omitempty"`
	BgpPeeringAddresses []IPConfigurationBgpPeeringAddress_STATUS `json:"bgpPeeringAddresses,omitempty"`
	PeerWeight          *int                                      `json:"peerWeight,omitempty"`
	PropertyBag         genruntime.PropertyBag                    `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewayAutoScaleConfiguration
// Virtual Network Gateway Autoscale Configuration details
type VirtualNetworkGatewayAutoScaleConfiguration struct {
	Bounds      *VirtualNetworkGatewayAutoScaleBounds `json:"bounds,omitempty"`
	PropertyBag genruntime.PropertyBag                `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewayAutoScaleConfiguration_STATUS
// Virtual Network Gateway Autoscale Configuration details
type VirtualNetworkGatewayAutoScaleConfiguration_STATUS struct {
	Bounds      *VirtualNetworkGatewayAutoScaleBounds_STATUS `json:"bounds,omitempty"`
	PropertyBag genruntime.PropertyBag                       `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewayIPConfiguration
// IP configuration for virtual network gateway.
type VirtualNetworkGatewayIPConfiguration struct {
	Name                      *string                `json:"name,omitempty"`
	PrivateIPAllocationMethod *string                `json:"privateIPAllocationMethod,omitempty"`
	PropertyBag               genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	PublicIPAddress           *SubResource           `json:"publicIPAddress,omitempty"`
	Subnet                    *SubResource           `json:"subnet,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewayIPConfiguration_STATUS
// IP configuration for virtual network gateway.
type VirtualNetworkGatewayIPConfiguration_STATUS struct {
	Etag                      *string                `json:"etag,omitempty"`
	Id                        *string                `json:"id,omitempty"`
	Name                      *string                `json:"name,omitempty"`
	PrivateIPAddress          *string                `json:"privateIPAddress,omitempty"`
	PrivateIPAllocationMethod *string                `json:"privateIPAllocationMethod,omitempty"`
	PropertyBag               genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	ProvisioningState         *string                `json:"provisioningState,omitempty"`
	PublicIPAddress           *SubResource_STATUS    `json:"publicIPAddress,omitempty"`
	Subnet                    *SubResource_STATUS    `json:"subnet,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewayNatRule
// VirtualNetworkGatewayNatRule Resource.
type VirtualNetworkGatewayNatRule struct {
	ExternalMappings  []VpnNatRuleMapping    `json:"externalMappings,omitempty"`
	InternalMappings  []VpnNatRuleMapping    `json:"internalMappings,omitempty"`
	IpConfigurationId *string                `json:"ipConfigurationId,omitempty"`
	Mode              *string                `json:"mode,omitempty"`
	Name              *string                `json:"name,omitempty"`
	PropertyBag       genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	Type              *string                `json:"type,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewayNatRule_STATUS
// VirtualNetworkGatewayNatRule Resource.
type VirtualNetworkGatewayNatRule_STATUS struct {
	Etag              *string                    `json:"etag,omitempty"`
	ExternalMappings  []VpnNatRuleMapping_STATUS `json:"externalMappings,omitempty"`
	Id                *string                    `json:"id,omitempty"`
	InternalMappings  []VpnNatRuleMapping_STATUS `json:"internalMappings,omitempty"`
	IpConfigurationId *string                    `json:"ipConfigurationId,omitempty"`
	Mode              *string                    `json:"mode,omitempty"`
	Name              *string                    `json:"name,omitempty"`
	PropertiesType    *string                    `json:"properties_type,omitempty"`
	PropertyBag       genruntime.PropertyBag     `json:"$propertyBag,omitempty"`
	ProvisioningState *string                    `json:"provisioningState,omitempty"`
	Type              *string                    `json:"type,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewayOperatorSpec
// Details for configuring operator behavior. Fields in this struct are interpreted by the operator directly rather than being passed to Azure
type VirtualNetworkGatewayOperatorSpec struct {
	ConfigMapExpressions []*core.DestinationExpression `json:"configMapExpressions,omitempty"`
	PropertyBag          genruntime.PropertyBag        `json:"$propertyBag,omitempty"`
	SecretExpressions    []*core.DestinationExpression `json:"secretExpressions,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewayPolicyGroup
// Parameters for VirtualNetworkGatewayPolicyGroup.
type VirtualNetworkGatewayPolicyGroup struct {
	IsDefault     *bool                                    `json:"isDefault,omitempty"`
	Name          *string                                  `json:"name,omitempty"`
	PolicyMembers []VirtualNetworkGatewayPolicyGroupMember `json:"policyMembers,omitempty"`
	Priority      *int                                     `json:"priority,omitempty"`
	PropertyBag   genruntime.PropertyBag                   `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewayPolicyGroup_STATUS
// Parameters for VirtualNetworkGatewayPolicyGroup.
type VirtualNetworkGatewayPolicyGroup_STATUS struct {
	Etag                              *string                                         `json:"etag,omitempty"`
	Id                                *string                                         `json:"id,omitempty"`
	IsDefault                         *bool                                           `json:"isDefault,omitempty"`
	Name                              *string                                         `json:"name,omitempty"`
	PolicyMembers                     []VirtualNetworkGatewayPolicyGroupMember_STATUS `json:"policyMembers,omitempty"`
	Priority                          *int                                            `json:"priority,omitempty"`
	PropertyBag                       genruntime.PropertyBag                          `json:"$propertyBag,omitempty"`
	ProvisioningState                 *string                                         `json:"provisioningState,omitempty"`
	VngClientConnectionConfigurations []SubResource_STATUS                            `json:"vngClientConnectionConfigurations,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewaySku
// VirtualNetworkGatewaySku details.
type VirtualNetworkGatewaySku struct {
	Name        *string                `json:"name,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	Tier        *string                `json:"tier,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewaySku_STATUS
// VirtualNetworkGatewaySku details.
type VirtualNetworkGatewaySku_STATUS struct {
	Capacity    *int                   `json:"capacity,omitempty"`
	Name        *string                `json:"name,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	Tier        *string                `json:"tier,omitempty"`
}

// Storage version of v1api20240301.VpnClientConfiguration
// VpnClientConfiguration for P2S client.
type VpnClientConfiguration struct {
	AadAudience                       *string                            `json:"aadAudience,omitempty"`
	AadIssuer                         *string                            `json:"aadIssuer,omitempty"`
	AadTenant                         *string                            `json:"aadTenant,omitempty"`
	PropertyBag                       genruntime.PropertyBag             `json:"$propertyBag,omitempty"`
	RadiusServerAddress               *string                            `json:"radiusServerAddress,omitempty"`
	RadiusServerSecret                *string                            `json:"radiusServerSecret,omitempty"`
	RadiusServers                     []RadiusServer                     `json:"radiusServers,omitempty"`
	VngClientConnectionConfigurations []VngClientConnectionConfiguration `json:"vngClientConnectionConfigurations,omitempty"`
	VpnAuthenticationTypes            []string                           `json:"vpnAuthenticationTypes,omitempty"`
	VpnClientAddressPool              *AddressSpace                      `json:"vpnClientAddressPool,omitempty"`
	VpnClientIpsecPolicies            []IpsecPolicy                      `json:"vpnClientIpsecPolicies,omitempty"`
	VpnClientProtocols                []string                           `json:"vpnClientProtocols,omitempty"`
	VpnClientRevokedCertificates      []VpnClientRevokedCertificate      `json:"vpnClientRevokedCertificates,omitempty"`
	VpnClientRootCertificates         []VpnClientRootCertificate         `json:"vpnClientRootCertificates,omitempty"`
}

// Storage version of v1api20240301.VpnClientConfiguration_STATUS
// VpnClientConfiguration for P2S client.
type VpnClientConfiguration_STATUS struct {
	AadAudience                       *string                                   `json:"aadAudience,omitempty"`
	AadIssuer                         *string                                   `json:"aadIssuer,omitempty"`
	AadTenant                         *string                                   `json:"aadTenant,omitempty"`
	PropertyBag                       genruntime.PropertyBag                    `json:"$propertyBag,omitempty"`
	RadiusServerAddress               *string                                   `json:"radiusServerAddress,omitempty"`
	RadiusServerSecret                *string                                   `json:"radiusServerSecret,omitempty"`
	RadiusServers                     []RadiusServer_STATUS                     `json:"radiusServers,omitempty"`
	VngClientConnectionConfigurations []VngClientConnectionConfiguration_STATUS `json:"vngClientConnectionConfigurations,omitempty"`
	VpnAuthenticationTypes            []string                                  `json:"vpnAuthenticationTypes,omitempty"`
	VpnClientAddressPool              *AddressSpace_STATUS                      `json:"vpnClientAddressPool,omitempty"`
	VpnClientIpsecPolicies            []IpsecPolicy_STATUS                      `json:"vpnClientIpsecPolicies,omitempty"`
	VpnClientProtocols                []string                                  `json:"vpnClientProtocols,omitempty"`
	VpnClientRevokedCertificates      []VpnClientRevokedCertificate_STATUS      `json:"vpnClientRevokedCertificates,omitempty"`
	VpnClientRootCertificates         []VpnClientRootCertificate_STATUS         `json:"vpnClientRootCertificates,omitempty"`
}

// Storage version of v1api20240301.IPConfigurationBgpPeeringAddress
// Properties of IPConfigurationBgpPeeringAddress.
type IPConfigurationBgpPeeringAddress struct {
	CustomBgpIpAddresses []string               `json:"customBgpIpAddresses,omitempty"`
	IpconfigurationId    *string                `json:"ipconfigurationId,omitempty"`
	PropertyBag          genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20240301.IPConfigurationBgpPeeringAddress_STATUS
// Properties of IPConfigurationBgpPeeringAddress.
type IPConfigurationBgpPeeringAddress_STATUS struct {
	CustomBgpIpAddresses  []string               `json:"customBgpIpAddresses,omitempty"`
	DefaultBgpIpAddresses []string               `json:"defaultBgpIpAddresses,omitempty"`
	IpconfigurationId     *string                `json:"ipconfigurationId,omitempty"`
	PropertyBag           genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	TunnelIpAddresses     []string               `json:"tunnelIpAddresses,omitempty"`
}

// Storage version of v1api20240301.IpsecPolicy
// An IPSec Policy configuration for a virtual network gateway connection.
type IpsecPolicy struct {
	DhGroup             *string                `json:"dhGroup,omitempty"`
	IkeEncryption       *string                `json:"ikeEncryption,omitempty"`
	IkeIntegrity        *string                `json:"ikeIntegrity,omitempty"`
	IpsecEncryption     *string                `json:"ipsecEncryption,omitempty"`
	IpsecIntegrity      *string                `json:"ipsecIntegrity,omitempty"`
	PfsGroup            *string                `json:"pfsGroup,omitempty"`
	PropertyBag         genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	SaDataSizeKilobytes *int                   `json:"saDataSizeKilobytes,omitempty"`
	SaLifeTimeSeconds   *int                   `json:"saLifeTimeSeconds,omitempty"`
}

// Storage version of v1api20240301.IpsecPolicy_STATUS
// An IPSec Policy configuration for a virtual network gateway connection.
type IpsecPolicy_STATUS struct {
	DhGroup             *string                `json:"dhGroup,omitempty"`
	IkeEncryption       *string                `json:"ikeEncryption,omitempty"`
	IkeIntegrity        *string                `json:"ikeIntegrity,omitempty"`
	IpsecEncryption     *string                `json:"ipsecEncryption,omitempty"`
	IpsecIntegrity      *string                `json:"ipsecIntegrity,omitempty"`
	PfsGroup            *string                `json:"pfsGroup,omitempty"`
	PropertyBag         genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	SaDataSizeKilobytes *int                   `json:"saDataSizeKilobytes,omitempty"`
	SaLifeTimeSeconds   *int                   `json:"saLifeTimeSeconds,omitempty"`
}

// Storage version of v1api20240301.RadiusServer
// Radius Server Settings.
type RadiusServer struct {
	PropertyBag         genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	RadiusServerAddress *string                `json:"radiusServerAddress,omitempty"`
	RadiusServerScore   *int                   `json:"radiusServerScore,omitempty"`
	RadiusServerSecret  *string                `json:"radiusServerSecret,omitempty"`
}

// Storage version of v1api20240301.RadiusServer_STATUS
// Radius Server Settings.
type RadiusServer_STATUS struct {
	PropertyBag         genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	RadiusServerAddress *string                `json:"radiusServerAddress,omitempty"`
	RadiusServerScore   *int                   `json:"radiusServerScore,omitempty"`
	RadiusServerSecret  *string                `json:"radiusServerSecret,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewayAutoScaleBounds
type VirtualNetworkGatewayAutoScaleBounds struct {
	Max         *int                   `json:"max,omitempty"`
	Min         *int                   `json:"min,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewayAutoScaleBounds_STATUS
type VirtualNetworkGatewayAutoScaleBounds_STATUS struct {
	Max         *int                   `json:"max,omitempty"`
	Min         *int                   `json:"min,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewayPolicyGroupMember
// Vpn Client Connection configuration PolicyGroup member
type VirtualNetworkGatewayPolicyGroupMember struct {
	AttributeType  *string                `json:"attributeType,omitempty"`
	AttributeValue *string                `json:"attributeValue,omitempty"`
	Name           *string                `json:"name,omitempty"`
	PropertyBag    genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20240301.VirtualNetworkGatewayPolicyGroupMember_STATUS
// Vpn Client Connection configuration PolicyGroup member
type VirtualNetworkGatewayPolicyGroupMember_STATUS struct {
	AttributeType  *string                `json:"attributeType,omitempty"`
	AttributeValue *string                `json:"attributeValue,omitempty"`
	Name           *string                `json:"name,omitempty"`
	PropertyBag    genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20240301.VngClientConnectionConfiguration
// A vpn client connection configuration for client connection configuration.
type VngClientConnectionConfiguration struct {
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`

	// Reference: Resource ID.
	Reference *genruntime.ResourceReference `armReference:"Id" json:"reference,omitempty"`
}

// Storage version of v1api20240301.VngClientConnectionConfiguration_STATUS
// A vpn client connection configuration for client connection configuration.
type VngClientConnectionConfiguration_STATUS struct {
	Id          *string                `json:"id,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20240301.VpnClientRevokedCertificate
// VPN client revoked certificate of virtual network gateway.
type VpnClientRevokedCertificate struct {
	Name        *string                `json:"name,omitempty"`
	PropertyBag genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	Thumbprint  *string                `json:"thumbprint,omitempty"`
}

// Storage version of v1api20240301.VpnClientRevokedCertificate_STATUS
// VPN client revoked certificate of virtual network gateway.
type VpnClientRevokedCertificate_STATUS struct {
	Etag              *string                `json:"etag,omitempty"`
	Id                *string                `json:"id,omitempty"`
	Name              *string                `json:"name,omitempty"`
	PropertyBag       genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	ProvisioningState *string                `json:"provisioningState,omitempty"`
	Thumbprint        *string                `json:"thumbprint,omitempty"`
}

// Storage version of v1api20240301.VpnClientRootCertificate
// VPN client root certificate of virtual network gateway.
type VpnClientRootCertificate struct {
	Name           *string                `json:"name,omitempty"`
	PropertyBag    genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	PublicCertData *string                `json:"publicCertData,omitempty"`
}

// Storage version of v1api20240301.VpnClientRootCertificate_STATUS
// VPN client root certificate of virtual network gateway.
type VpnClientRootCertificate_STATUS struct {
	Etag              *string                `json:"etag,omitempty"`
	Id                *string                `json:"id,omitempty"`
	Name              *string                `json:"name,omitempty"`
	PropertyBag       genruntime.PropertyBag `json:"$propertyBag,omitempty"`
	ProvisioningState *string                `json:"provisioningState,omitempty"`
	PublicCertData    *string                `json:"publicCertData,omitempty"`
}

// Storage version of v1api20240301.VpnNatRuleMapping
// Vpn NatRule mapping.
type VpnNatRuleMapping struct {
	AddressSpace *string                `json:"addressSpace,omitempty"`
	PortRange    *string                `json:"portRange,omitempty"`
	PropertyBag  genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

// Storage version of v1api20240301.VpnNatRuleMapping_STATUS
// Vpn NatRule mapping.
type VpnNatRuleMapping_STATUS struct {
	AddressSpace *string                `json:"addressSpace,omitempty"`
	PortRange    *string                `json:"portRange,omitempty"`
	PropertyBag  genruntime.PropertyBag `json:"$propertyBag,omitempty"`
}

func init() {
	SchemeBuilder.Register(&VirtualNetworkGateway{}, &VirtualNetworkGatewayList{})
}
