/*
 * 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;

/**
 * @author slriv
 *
 */
public class CloudStackTemplate {
	@SerializedName(ApiConstants.ID)
	private String id;
	@SerializedName(ApiConstants.ACCOUNT)
	private String account;
	@SerializedName(ApiConstants.ACCOUNT_ID)
	private String accountId;
	@SerializedName(ApiConstants.BOOTABLE)
	private Boolean bootable;
	@SerializedName(ApiConstants.CHECKSUM)
	private String checksum;
	@SerializedName(ApiConstants.CREATED)
	private String created;
	@SerializedName(ApiConstants.CROSS_ZONES)
	private Boolean crossZones;
	@SerializedName(ApiConstants.DISPLAY_TEXT)
	private String displayText;
	@SerializedName(ApiConstants.DOMAIN)
	private String domain;
	@SerializedName(ApiConstants.DOMAIN_ID)
	private String domainId;
	@SerializedName(ApiConstants.FORMAT)
	private String format;
	@SerializedName(ApiConstants.HOST_ID)
	private String hostId;
	@SerializedName(ApiConstants.HOST_NAME)
	private String hostName;
	@SerializedName(ApiConstants.HYPERVISOR)
	private String hyperVisor;
	@SerializedName(ApiConstants.IS_EXTRACTABLE)
	private Boolean isExtractable;
	@SerializedName(ApiConstants.IS_FEATURED)
	private Boolean isFeatured;
	@SerializedName(ApiConstants.IS_PUBLIC)
	private Boolean isPublic;
	@SerializedName(ApiConstants.IS_READY)
	private Boolean isReady;
	@SerializedName(ApiConstants.JOB_ID)
	private String jobId;
	@SerializedName(ApiConstants.JOB_STATUS)
	private String jobStatus;	
	@SerializedName(ApiConstants.NAME)
	private String name;
	@SerializedName(ApiConstants.OS_TYPE_ID)
	private String osTypeId;
	@SerializedName(ApiConstants.OS_TYPE_NAME)
	private String osTypeName;
	@SerializedName(ApiConstants.PASSWORD_ENABLED)
	private Boolean passwordEnabled;
	@SerializedName(ApiConstants.REMOVED)
	private String removedDate;
	@SerializedName(ApiConstants.SIZE)
	private Long size;
	@SerializedName(ApiConstants.SOURCE_TEMPLATE_ID)
	private String sourceTemplateId;
	@SerializedName(ApiConstants.STATUS)
	private String status;
	@SerializedName(ApiConstants.TEMPLATE_TYPE)
	private String templateType;
	@SerializedName(ApiConstants.ZONE_ID)
	private String zoneId;
	@SerializedName(ApiConstants.ZONE_NAME)
	private String zoneName;

	/**
	 * 
	 */
	public CloudStackTemplate() {
	}

	/**
	 * @return the id
	 */
	public String getId() {
		return id;
	}

	/**
	 * @return the account
	 */
	public String getAccount() {
		return account;
	}

	/**
	 * @return the accountId
	 */
	public String getAccountId() {
		return accountId;
	}

	/**
	 * @return the bootable
	 */
	public Boolean getBootable() {
		return bootable;
	}

	/**
	 * @return the checksum
	 */
	public String getChecksum() {
		return checksum;
	}

	/**
	 * @return the created
	 */
	public String getCreated() {
		return created;
	}

	/**
	 * @return the crossZones
	 */
	public Boolean getCrossZones() {
		return crossZones;
	}

	/**
	 * @return the displayText
	 */
	public String getDisplayText() {
		return displayText;
	}

	/**
	 * @return the domain
	 */
	public String getDomain() {
		return domain;
	}

	/**
	 * @return the domainId
	 */
	public String getDomainId() {
		return domainId;
	}

	/**
	 * @return the format
	 */
	public String getFormat() {
		return format;
	}

	/**
	 * @return the hostId
	 */
	public String getHostId() {
		return hostId;
	}

	/**
	 * @return the hostName
	 */
	public String getHostName() {
		return hostName;
	}

	/**
	 * @return the hyperVisor
	 */
	public String getHyperVisor() {
		return hyperVisor;
	}

	/**
	 * @return the isExtractable
	 */
	public Boolean getIsExtractable() {
		return isExtractable;
	}

	/**
	 * @return the isFeatured
	 */
	public Boolean getIsFeatured() {
		return isFeatured;
	}

	/**
	 * @return the isPublic
	 */
	public Boolean getIsPublic() {
		return isPublic;
	}

	/**
	 * @return the isReady
	 */
	public Boolean getIsReady() {
		return isReady;
	}

	/**
	 * @return the jobId
	 */
	public String getJobId() {
		return jobId;
	}

	/**
	 * @return the jobStatus
	 */
	public String getJobStatus() {
		return jobStatus;
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @return the osTypeId
	 */
	public String getOsTypeId() {
		return osTypeId;
	}

	/**
	 * @return the osTypeName
	 */
	public String getOsTypeName() {
		return osTypeName;
	}

	/**
	 * @return the passwordEnabled
	 */
	public Boolean getPasswordEnabled() {
		return passwordEnabled;
	}

	/**
	 * @return the removedDate
	 */
	public String getRemovedDate() {
		return removedDate;
	}

	/**
	 * @return the size
	 */
	public Long getSize() {
		return size;
	}

	/**
	 * @return the sourceTemplateId
	 */
	public String getSourceTemplateId() {
		return sourceTemplateId;
	}

	/**
	 * @return the status
	 */
	public String getStatus() {
		return status;
	}

	/**
	 * @return the templateType
	 */
	public String getTemplateType() {
		return templateType;
	}

	/**
	 * @return the zoneId
	 */
	public String getZoneId() {
		return zoneId;
	}

	/**
	 * @return the zoneName
	 */
	public String getZoneName() {
		return zoneName;
	}

}
