/*
 * Copyright (C) 2011 Citrix Systems, Inc.  All rights reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.cloud.stack.models;

import com.google.gson.annotations.SerializedName;

public class CloudStackZone {
    @SerializedName(ApiConstants.ID)
    private String id;
    @SerializedName(ApiConstants.ALLOCATION_STATE)
    private String allocationState;
    @SerializedName(ApiConstants.DESCRIPTION)
    private String description;
    @SerializedName(ApiConstants.DHCP_PROVIDER)
    private String dhcpProvider;
    @SerializedName(ApiConstants.DISPLAY_TEXT)
    private String displayText;
    @SerializedName(ApiConstants.DNS1)
    private String dns1;
    @SerializedName(ApiConstants.DNS2)
    private String dns2;
    @SerializedName(ApiConstants.DOMAIN)
    private String domain;
    @SerializedName(ApiConstants.DOMAIN_ID)
    private Long domainId;
    @SerializedName(ApiConstants.GUEST_CIDR_ADDRESS)
    private String guestCidrAddress;
    @SerializedName(ApiConstants.INTERNAL_DNS1)
    private String internalDns1;
    @SerializedName(ApiConstants.INTERNAL_DNS2)
    private String internalDns2;
    @SerializedName(ApiConstants.NAME)
    private String name;
    @SerializedName(ApiConstants.NETWORK_TYPE)
    private String networkType;
    @SerializedName(ApiConstants.SECURITY_GROUPS_ENABLED)
    private Boolean securityGroupsEnabled;
    @SerializedName(ApiConstants.VLAN)
    private String vlan; 
    @SerializedName(ApiConstants.ZONE_TOKEN)
    private String zoneToken;
    
    public CloudStackZone() {
    }

	/**
	 * @return the id
	 */
	public String getId() {
		return id;
	}

	/**
	 * @return the allocationState
	 */
	public String getAllocationState() {
		return allocationState;
	}

	/**
	 * @return the description
	 */
	public String getDescription() {
		return description;
	}

	/**
	 * @return the dhcpProvider
	 */
	public String getDhcpProvider() {
		return dhcpProvider;
	}

	/**
	 * @return the displayText
	 */
	public String getDisplayText() {
		return displayText;
	}

	/**
	 * @return the dns1
	 */
	public String getDns1() {
		return dns1;
	}

	/**
	 * @return the dns2
	 */
	public String getDns2() {
		return dns2;
	}

	/**
	 * @return the domain
	 */
	public String getDomain() {
		return domain;
	}

	/**
	 * @return the domainId
	 */
	public Long getDomainId() {
		return domainId;
	}

	/**
	 * @return the guestCidrAddress
	 */
	public String getGuestCidrAddress() {
		return guestCidrAddress;
	}

	/**
	 * @return the internalDns1
	 */
	public String getInternalDns1() {
		return internalDns1;
	}

	/**
	 * @return the internalDns2
	 */
	public String getInternalDns2() {
		return internalDns2;
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @return the networkType
	 */
	public String getNetworkType() {
		return networkType;
	}

	/**
	 * @return the securityGroupsEnabled
	 */
	public Boolean getSecurityGroupsEnabled() {
		return securityGroupsEnabled;
	}

	/**
	 * @return the vlan
	 */
	public String getVlan() {
		return vlan;
	}

	/**
	 * @return the zoneToken
	 */
	public String getZoneToken() {
		return zoneToken;
	}
}
