/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 * 
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is
 * regenerated.
 */

'use strict';

var models = require('./index');

var util = require('util');

/**
 * @class
 * Initializes a new instance of the NetworkInterfaceIPConfiguration class.
 * @constructor
 * IPConfiguration in a NetworkInterface
 *
 * @member {array} [applicationGatewayBackendAddressPools] Gets or sets the
 * reference of ApplicationGatewayBackendAddressPool resource
 * 
 * @member {array} [loadBalancerBackendAddressPools] Gets or sets the
 * reference of LoadBalancerBackendAddressPool resource
 * 
 * @member {array} [loadBalancerInboundNatRules] Gets or sets list of
 * references of LoadBalancerInboundNatRules
 * 
 * @member {string} [privateIPAddress]
 * 
 * @member {string} [privateIPAllocationMethod] Gets or sets PrivateIP
 * allocation method. Possible values include: 'Static', 'Dynamic'
 * 
 * @member {string} [privateIPAddressVersion] Gets or sets PrivateIP address
 * version (IPv4/IPv6). Possible values include: 'IPv4', 'IPv6'
 * 
 * @member {object} [subnet]
 * 
 * @member {string} [subnet.addressPrefix] Gets or sets Address prefix for the
 * subnet.
 * 
 * @member {object} [subnet.networkSecurityGroup] Gets or sets the reference
 * of the NetworkSecurityGroup resource
 * 
 * @member {array} [subnet.networkSecurityGroup.securityRules] Gets or sets
 * security rules of network security group
 * 
 * @member {array} [subnet.networkSecurityGroup.defaultSecurityRules] Gets or
 * default security rules of network security group
 * 
 * @member {array} [subnet.networkSecurityGroup.networkInterfaces] Gets
 * collection of references to Network Interfaces
 * 
 * @member {array} [subnet.networkSecurityGroup.subnets] Gets collection of
 * references to subnets
 * 
 * @member {string} [subnet.networkSecurityGroup.resourceGuid] Gets or sets
 * resource guid property of the network security group resource
 * 
 * @member {string} [subnet.networkSecurityGroup.provisioningState] Gets
 * provisioning state of the PublicIP resource Updating/Deleting/Failed
 * 
 * @member {string} [subnet.networkSecurityGroup.etag] Gets a unique read-only
 * string that changes whenever the resource is updated
 * 
 * @member {object} [subnet.routeTable] Gets or sets the reference of the
 * RouteTable resource
 * 
 * @member {array} [subnet.routeTable.routes] Gets or sets Routes in a Route
 * Table
 * 
 * @member {array} [subnet.routeTable.subnets] Gets collection of references
 * to subnets
 * 
 * @member {string} [subnet.routeTable.provisioningState] Gets provisioning
 * state of the resource Updating/Deleting/Failed
 * 
 * @member {string} [subnet.routeTable.etag] Gets a unique read-only string
 * that changes whenever the resource is updated
 * 
 * @member {array} [subnet.ipConfigurations] Gets array of references to the
 * network interface IP configurations using subnet
 * 
 * @member {string} [subnet.provisioningState] Gets provisioning state of the
 * resource
 * 
 * @member {string} [subnet.name] Gets or sets the name of the resource that
 * is unique within a resource group. This name can be used to access the
 * resource
 * 
 * @member {string} [subnet.etag] A unique read-only string that changes
 * whenever the resource is updated
 * 
 * @member {boolean} [primary] Gets whether this is a primary customer address
 * on the NIC
 * 
 * @member {object} [publicIPAddress]
 * 
 * @member {string} [publicIPAddress.publicIPAllocationMethod] Gets or sets
 * PublicIP allocation method (Static/Dynamic). Possible values include:
 * 'Static', 'Dynamic'
 * 
 * @member {string} [publicIPAddress.publicIPAddressVersion] Gets or sets
 * PublicIP address version (IPv4/IPv6). Possible values include: 'IPv4',
 * 'IPv6'
 * 
 * @member {object} [publicIPAddress.ipConfiguration]
 * 
 * @member {string} [publicIPAddress.ipConfiguration.privateIPAddress] Gets or
 * sets the privateIPAddress of the IP Configuration
 * 
 * @member {string}
 * [publicIPAddress.ipConfiguration.privateIPAllocationMethod] Gets or sets
 * PrivateIP allocation method. Possible values include: 'Static', 'Dynamic'
 * 
 * @member {object} [publicIPAddress.ipConfiguration.subnet] Gets or sets the
 * reference of the subnet resource
 * 
 * @member {string} [publicIPAddress.ipConfiguration.subnet.addressPrefix]
 * Gets or sets Address prefix for the subnet.
 * 
 * @member {object}
 * [publicIPAddress.ipConfiguration.subnet.networkSecurityGroup] Gets or sets
 * the reference of the NetworkSecurityGroup resource
 * 
 * @member {array}
 * [publicIPAddress.ipConfiguration.subnet.networkSecurityGroup.securityRules]
 * Gets or sets security rules of network security group
 * 
 * @member {array}
 * [publicIPAddress.ipConfiguration.subnet.networkSecurityGroup.defaultSecurityRules]
 * Gets or default security rules of network security group
 * 
 * @member {array}
 * [publicIPAddress.ipConfiguration.subnet.networkSecurityGroup.networkInterfaces]
 * Gets collection of references to Network Interfaces
 * 
 * @member {array}
 * [publicIPAddress.ipConfiguration.subnet.networkSecurityGroup.subnets] Gets
 * collection of references to subnets
 * 
 * @member {string}
 * [publicIPAddress.ipConfiguration.subnet.networkSecurityGroup.resourceGuid]
 * Gets or sets resource guid property of the network security group resource
 * 
 * @member {string}
 * [publicIPAddress.ipConfiguration.subnet.networkSecurityGroup.provisioningState]
 * Gets provisioning state of the PublicIP resource Updating/Deleting/Failed
 * 
 * @member {string}
 * [publicIPAddress.ipConfiguration.subnet.networkSecurityGroup.etag] Gets a
 * unique read-only string that changes whenever the resource is updated
 * 
 * @member {object} [publicIPAddress.ipConfiguration.subnet.routeTable] Gets
 * or sets the reference of the RouteTable resource
 * 
 * @member {array} [publicIPAddress.ipConfiguration.subnet.routeTable.routes]
 * Gets or sets Routes in a Route Table
 * 
 * @member {array} [publicIPAddress.ipConfiguration.subnet.routeTable.subnets]
 * Gets collection of references to subnets
 * 
 * @member {string}
 * [publicIPAddress.ipConfiguration.subnet.routeTable.provisioningState] Gets
 * provisioning state of the resource Updating/Deleting/Failed
 * 
 * @member {string} [publicIPAddress.ipConfiguration.subnet.routeTable.etag]
 * Gets a unique read-only string that changes whenever the resource is
 * updated
 * 
 * @member {array} [publicIPAddress.ipConfiguration.subnet.ipConfigurations]
 * Gets array of references to the network interface IP configurations using
 * subnet
 * 
 * @member {string} [publicIPAddress.ipConfiguration.subnet.provisioningState]
 * Gets provisioning state of the resource
 * 
 * @member {string} [publicIPAddress.ipConfiguration.subnet.name] Gets or sets
 * the name of the resource that is unique within a resource group. This name
 * can be used to access the resource
 * 
 * @member {string} [publicIPAddress.ipConfiguration.subnet.etag] A unique
 * read-only string that changes whenever the resource is updated
 * 
 * @member {object} [publicIPAddress.ipConfiguration.publicIPAddress] Gets or
 * sets the reference of the PublicIP resource
 * 
 * @member {string} [publicIPAddress.ipConfiguration.provisioningState] Gets
 * provisioning state of the PublicIP resource Updating/Deleting/Failed
 * 
 * @member {string} [publicIPAddress.ipConfiguration.name] Gets name of the
 * resource that is unique within a resource group. This name can be used to
 * access the resource
 * 
 * @member {string} [publicIPAddress.ipConfiguration.etag] A unique read-only
 * string that changes whenever the resource is updated
 * 
 * @member {object} [publicIPAddress.dnsSettings] Gets or sets FQDN of the DNS
 * record associated with the public IP address
 * 
 * @member {string} [publicIPAddress.dnsSettings.domainNameLabel] Gets or sets
 * the Domain name label.The concatenation of the domain name label and the
 * regionalized DNS zone make up the fully qualified domain name associated
 * with the public IP address. If a domain name label is specified, an A DNS
 * record is created for the public IP in the Microsoft Azure DNS system.
 * 
 * @member {string} [publicIPAddress.dnsSettings.fqdn] Gets the FQDN, Fully
 * qualified domain name of the A DNS record associated with the public IP.
 * This is the concatenation of the domainNameLabel and the regionalized DNS
 * zone.
 * 
 * @member {string} [publicIPAddress.dnsSettings.reverseFqdn] Gets or Sests
 * the Reverse FQDN. A user-visible, fully qualified domain name that
 * resolves to this public IP address. If the reverseFqdn is specified, then
 * a PTR DNS record is created pointing from the IP address in the
 * in-addr.arpa domain to the reverse FQDN.
 * 
 * @member {string} [publicIPAddress.ipAddress]
 * 
 * @member {number} [publicIPAddress.idleTimeoutInMinutes] Gets or sets the
 * Idletimeout of the public IP address
 * 
 * @member {string} [publicIPAddress.resourceGuid] Gets or sets resource guid
 * property of the PublicIP resource
 * 
 * @member {string} [publicIPAddress.provisioningState] Gets provisioning
 * state of the PublicIP resource Updating/Deleting/Failed
 * 
 * @member {string} [publicIPAddress.etag] Gets a unique read-only string that
 * changes whenever the resource is updated
 * 
 * @member {string} [provisioningState]
 * 
 * @member {string} [name] Gets name of the resource that is unique within a
 * resource group. This name can be used to access the resource
 * 
 * @member {string} [etag] A unique read-only string that changes whenever the
 * resource is updated
 * 
 */
function NetworkInterfaceIPConfiguration() {
  NetworkInterfaceIPConfiguration['super_'].call(this);
}

util.inherits(NetworkInterfaceIPConfiguration, models['SubResource']);

/**
 * Defines the metadata of NetworkInterfaceIPConfiguration
 *
 * @returns {object} metadata of NetworkInterfaceIPConfiguration
 *
 */
NetworkInterfaceIPConfiguration.prototype.mapper = function () {
  return {
    required: false,
    serializedName: 'NetworkInterfaceIPConfiguration',
    type: {
      name: 'Composite',
      className: 'NetworkInterfaceIPConfiguration',
      modelProperties: {
        id: {
          required: false,
          serializedName: 'id',
          type: {
            name: 'String'
          }
        },
        applicationGatewayBackendAddressPools: {
          required: false,
          serializedName: 'properties.applicationGatewayBackendAddressPools',
          type: {
            name: 'Sequence',
            element: {
                required: false,
                serializedName: 'ApplicationGatewayBackendAddressPoolElementType',
                type: {
                  name: 'Composite',
                  className: 'ApplicationGatewayBackendAddressPool'
                }
            }
          }
        },
        loadBalancerBackendAddressPools: {
          required: false,
          serializedName: 'properties.loadBalancerBackendAddressPools',
          type: {
            name: 'Sequence',
            element: {
                required: false,
                serializedName: 'BackendAddressPoolElementType',
                type: {
                  name: 'Composite',
                  className: 'BackendAddressPool'
                }
            }
          }
        },
        loadBalancerInboundNatRules: {
          required: false,
          serializedName: 'properties.loadBalancerInboundNatRules',
          type: {
            name: 'Sequence',
            element: {
                required: false,
                serializedName: 'InboundNatRuleElementType',
                type: {
                  name: 'Composite',
                  className: 'InboundNatRule'
                }
            }
          }
        },
        privateIPAddress: {
          required: false,
          serializedName: 'properties.privateIPAddress',
          type: {
            name: 'String'
          }
        },
        privateIPAllocationMethod: {
          required: false,
          serializedName: 'properties.privateIPAllocationMethod',
          type: {
            name: 'String'
          }
        },
        privateIPAddressVersion: {
          required: false,
          serializedName: 'properties.privateIPAddressVersion',
          type: {
            name: 'String'
          }
        },
        subnet: {
          required: false,
          serializedName: 'properties.subnet',
          type: {
            name: 'Composite',
            className: 'Subnet'
          }
        },
        primary: {
          required: false,
          serializedName: 'properties.primary',
          type: {
            name: 'Boolean'
          }
        },
        publicIPAddress: {
          required: false,
          serializedName: 'properties.publicIPAddress',
          type: {
            name: 'Composite',
            className: 'PublicIPAddress'
          }
        },
        provisioningState: {
          required: false,
          serializedName: 'properties.provisioningState',
          type: {
            name: 'String'
          }
        },
        name: {
          required: false,
          serializedName: 'name',
          type: {
            name: 'String'
          }
        },
        etag: {
          required: false,
          serializedName: 'etag',
          type: {
            name: 'String'
          }
        }
      }
    }
  };
};

module.exports = NetworkInterfaceIPConfiguration;
