// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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.api.query.vo;

import java.net.URI;
import java.util.Date;
import java.util.Map;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.network.Network.GuestType;
import com.cloud.network.Networks.TrafficType;
import com.cloud.server.ResourceTag.TaggedResourceType;
import com.cloud.storage.Volume;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.utils.db.Encrypt;
import com.cloud.utils.db.GenericDao;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.State;

@Entity
@Table(name="user_vm_view")
public class UserVmJoinVO extends BaseViewVO implements ControlledViewEntity {

    @Id
    @Column(name="id", updatable=false, nullable = false)
    private long id;

    @Column(name="name", updatable=false, nullable=false, length=255)
    private String name = null;

    @Column(name="display_name", updatable=false, nullable=false, length=255)
    private String displayName = null;

    @Column(name="account_id")
    private long accountId;

    @Column(name="account_uuid")
    private String accountUuid;

    @Column(name="account_name")
    private String accountName = null;

    @Column(name="account_type")
    private short accountType;

    @Column(name="domain_id")
    private long domainId;

    @Column(name="domain_uuid")
    private String domainUuid;

    @Column(name="domain_name")
    private String domainName = null;

    @Column(name="domain_path")
    private String domainPath = null;

    @Column(name="instance_group_id")
    private long instanceGroupId;

    @Column(name="instance_group_uuid")
    private String instanceGroupUuid;

    @Column(name="instance_group_name")
    private String instanceGroupName;

    @Column(name="vm_type", updatable=false, nullable=false, length=32)
    @Enumerated(value=EnumType.STRING)
    protected VirtualMachine.Type type;

    /**
     * Note that state is intentionally missing the setter.  Any updates to
     * the state machine needs to go through the DAO object because someone
     * else could be updating it as well.
     */
    @Enumerated(value=EnumType.STRING)
    @Column(name="state", updatable=true, nullable=false, length=32)
    private State state = null;

    @Column(name=GenericDao.CREATED_COLUMN)
    private Date created;

    @Column(name=GenericDao.REMOVED_COLUMN)
    private Date removed;

    @Column(name="instance_name", updatable=true, nullable=false)
    private String instanceName;

    @Column(name="guest_os_id", nullable=false, length=17)
    private long guestOsId;

    @Column(name="guest_os_uuid")
    private String guestOsUuid;

    @Column(name="hypervisor_type")
    @Enumerated(value=EnumType.STRING)
    private HypervisorType hypervisorType;

    @Column(name="ha_enabled", updatable=true, nullable=true)
    private boolean haEnabled;

    @Encrypt
    @Column(name="vnc_password", updatable=true, nullable=false, length=255)
    protected String vncPassword;

    @Column(name="limit_cpu_use", updatable=true, nullable=true)
    private boolean limitCpuUse;

    @Column(name="last_host_id", updatable=true, nullable=true)
    private Long lastHostId;

    @Column(name="private_ip_address", updatable=true)
    private String privateIpAddress;


    @Column(name="private_mac_address", updatable=true, nullable=true)
    private String privateMacAddress;

    @Column(name="pod_id", updatable=true, nullable=false)
    private Long podId;

    @Column(name="pod_uuid")
    private String podUuid;

    @Column(name="data_center_id")
    private long dataCenterId;

    @Column(name="data_center_uuid")
    private String dataCenterUuid;

    @Column(name="data_center_name")
    private String dataCenterName = null;

    @Column(name="data_center_type")
    private String dataCenterType = null;
    
    @Column(name="security_group_enabled")
    private boolean securityGroupEnabled;

    @Column(name="host_id", updatable=true, nullable=true)
    private long hostId;

    @Column(name="host_uuid")
    private String hostUuid;

    @Column(name="host_name", nullable=false)
    private String hostName;

    @Column(name="template_id", updatable=true, nullable=true, length=17)
    private long templateId;

    @Column(name="template_uuid")
    private String templateUuid;

    @Column(name="template_name")
    private String templateName;

    @Column(name="template_display_text", length=4096)
    private String templateDisplayText;

    @Column(name="password_enabled")
    private boolean passwordEnabled;

    @Column(name="iso_id", updatable=true, nullable=true, length=17)
    private long isoId;

    @Column(name="iso_uuid")
    private String isoUuid;

    @Column(name="iso_name")
    private String isoName;

    @Column(name="iso_display_text", length=4096)
    private String isoDisplayText;

    @Column(name="service_offering_id")
    private long serviceOfferingId;

    @Column(name="service_offering_uuid")
    private String serviceOfferingUuid;

    @Column(name="service_offering_name")
    private String serviceOfferingName;

    @Column(name="cpu")
    private int cpu;

    @Column(name="speed")
    private int speed;

    @Column(name="ram_size")
    private int ramSize;

    @Column(name="pool_id", updatable=false, nullable = false)
    private long poolId;

    @Column(name="pool_uuid")
    private String poolUuid;

    @Column(name="pool_type", updatable=false, nullable=false, length=32)
    @Enumerated(value=EnumType.STRING)
    private StoragePoolType poolType;

    @Column(name = "volume_id")
    private long volume_id;

    @Column(name = "volume_uuid")
    private String volume_uuid;

    @Column(name = "volume_device_id")
    private Long volumeDeviceId = null;

    @Column(name = "volume_type")
    @Enumerated(EnumType.STRING)
    private Volume.Type volumeType;

    @Column(name = "security_group_id")
    private long securityGroupId;

    @Column(name = "security_group_uuid")
    private String securityGroupUuid;

    @Column(name = "security_group_name")
    private String securityGroupName;

    @Column(name = "security_group_description")
    private String securityGroupDescription;

    @Column(name = "vpc_id")
    private long vpcId;

    @Column(name = "vpc_uuid")
    private String vpcUuid;

    @Column(name = "nic_id")
    private long nicId;

    @Column(name = "nic_uuid")
    private String nicUuid;

    @Column(name = "is_default_nic")
    private boolean isDefaultNic;

    @Column(name = "ip_address")
    private String ipAddress;

    @Column(name = "gateway")
    private String gateway;

    @Column(name = "netmask")
    private String netmask;

    @Column(name = "ip6_address")
    private String ip6Address;

    @Column(name = "ip6_gateway")
    private String ip6Gateway;

    @Column(name = "ip6_cidr")
    private String ip6Cidr;

    @Column(name = "mac_address")
    private String macAddress;

    @Column(name = "broadcast_uri")
    private URI broadcastUri;

    @Column(name = "isolation_uri")
    private URI isolationUri;

    @Column(name="network_id")
    private long networkId;

    @Column(name="network_uuid")
    private String networkUuid;

    @Column(name="network_name")
    private String networkName;

    @Column(name="traffic_type")
    @Enumerated(value=EnumType.STRING)
    private TrafficType trafficType;

    @Column(name="guest_type")
    @Enumerated(value=EnumType.STRING)
    private GuestType guestType;

    @Column(name = "public_ip_id")
    private long publicIpId;

    @Column(name = "public_ip_uuid")
    private String publicIpUuid;

    @Column(name = "public_ip_address")
    private String publicIpAddress;

    @Column(name="user_data", updatable=true, nullable=true, length=2048)
    private String userData;

    @Column(name="project_id")
    private long projectId;

    @Column(name="project_uuid")
    private String projectUuid;

    @Column(name="project_name")
    private String projectName;

    @Column(name="keypair_name")
    private String keypairName;

    @Column(name="job_id")
    private Long jobId;

    @Column(name="job_uuid")
    private String jobUuid;

    @Column(name="job_status")
    private int jobStatus;

    @Column(name="tag_id")
    private long tagId;

    @Column(name="tag_uuid")
    private String tagUuid;

    @Column(name="tag_key")
    private String tagKey;

    @Column(name="tag_value")
    private String tagValue;

    @Column(name="tag_domain_id")
    private long tagDomainId;

    @Column(name="tag_account_id")
    private long tagAccountId;

    @Column(name="tag_resource_id")
    private long tagResourceId;

    @Column(name="tag_resource_uuid")
    private String tagResourceUuid;

    @Column(name="tag_resource_type")
    @Enumerated(value=EnumType.STRING)
    private TaggedResourceType tagResourceType;

    @Column(name="tag_customer")
    private String tagCustomer;

    @Column(name = "affinity_group_id")
    private long affinityGroupId;

    @Column(name = "affinity_group_uuid")
    private String affinityGroupUuid;

    @Column(name = "affinity_group_name")
    private String affinityGroupName;

    @Column(name = "affinity_group_description")
    private String affinityGroupDescription;

    transient String password;

    @Transient
    Map<String, String> details;

    @Column(name="uuid")
    private String uuid;

    public UserVmJoinVO() {
    }


    @Override
    public long getId() {
        return id;
    }

    @Override
    public void setId(long id) {
        this.id = id;
    }


    @Override
    public String getUuid() {
        return uuid;
    }




    public void setUuid(String uuid) {
        this.uuid = uuid;
    }


    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public String getDisplayName() {
        return displayName;
    }


    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }


    @Override
    public long getAccountId() {
        return accountId;
    }


    public void setAccountId(long accountId) {
        this.accountId = accountId;
    }


    @Override
    public String getAccountUuid() {
        return accountUuid;
    }




    public void setAccountUuid(String accountUuid) {
        this.accountUuid = accountUuid;
    }




    @Override
    public String getAccountName() {
        return accountName;
    }


    public void setAccountName(String accountName) {
        this.accountName = accountName;
    }


    @Override
    public short getAccountType() {
        return accountType;
    }


    public void setAccountType(short accountType) {
        this.accountType = accountType;
    }


    @Override
    public long getDomainId() {
        return domainId;
    }


    public void setDomainId(long domainId) {
        this.domainId = domainId;
    }


    @Override
    public String getDomainUuid() {
        return domainUuid;
    }




    public void setDomainUuid(String domainUuid) {
        this.domainUuid = domainUuid;
    }




    @Override
    public String getDomainName() {
        return domainName;
    }


    public void setDomainName(String domainName) {
        this.domainName = domainName;
    }


    @Override
    public String getDomainPath() {
        return domainPath;
    }


    public void setDomainPath(String domainPath) {
        this.domainPath = domainPath;
    }




    public long getInstanceGroupId() {
        return instanceGroupId;
    }


    public void setInstanceGroupId(long instanceGroupId) {
        this.instanceGroupId = instanceGroupId;
    }


    public String getInstanceGroupUuid() {
        return instanceGroupUuid;
    }




    public void setInstanceGroupUuid(String instanceGroupUuid) {
        this.instanceGroupUuid = instanceGroupUuid;
    }




    public String getInstanceGroupName() {
        return instanceGroupName;
    }


    public void setInstanceGroupName(String instanceGroupName) {
        this.instanceGroupName = instanceGroupName;
    }


    public VirtualMachine.Type getType() {
        return type;
    }




    public void setType(VirtualMachine.Type type) {
        this.type = type;
    }




    public State getState() {
        return state;
    }


    public void setState(State state) {
        this.state = state;
    }


    public Date getCreated() {
        return created;
    }


    public void setCreated(Date created) {
        this.created = created;
    }


    public Date getRemoved() {
        return removed;
    }


    public void setRemoved(Date removed) {
        this.removed = removed;
    }


    public String getInstanceName() {
        return instanceName;
    }


    public void setInstanceName(String instanceName) {
        this.instanceName = instanceName;
    }


    public long getGuestOSId() {
        return guestOsId;
    }


    public void setGuestOSId(long guestOSId) {
        this.guestOsId = guestOSId;
    }


    public String getGuestOsUuid() {
        return guestOsUuid;
    }




    public void setGuestOsUuid(String guestOsUuid) {
        this.guestOsUuid = guestOsUuid;
    }




    public HypervisorType getHypervisorType() {
        return hypervisorType;
    }


    public void setHypervisorType(HypervisorType hypervisorType) {
        this.hypervisorType = hypervisorType;
    }


    public boolean isHaEnabled() {
        return haEnabled;
    }


    public void setHaEnabled(boolean haEnabled) {
        this.haEnabled = haEnabled;
    }

    public void setVncPassword(String vncPassword) {
        this.vncPassword = vncPassword;
    }

    public String getVncPassword() {
        return vncPassword;
    }




    public String getPrivateIpAddress() {
        return privateIpAddress;
    }




    public void setPrivateIpAddress(String privateIpAddress) {
        this.privateIpAddress = privateIpAddress;
    }




    public String getPrivateMacAddress() {
        return privateMacAddress;
    }




    public void setPrivateMacAddress(String privateMacAddress) {
        this.privateMacAddress = privateMacAddress;
    }




    public Long getLastHostId() {
        return lastHostId;
    }




    public void setLastHostId(Long lastHostId) {
        this.lastHostId = lastHostId;
    }






    public Long getPodId() {
        return podId;
    }




    public void setPodId(Long podIdToDeployIn) {
        this.podId = podIdToDeployIn;
    }




    public String getPodUuid() {
        return podUuid;
    }




    public void setPodUuid(String podUuid) {
        this.podUuid = podUuid;
    }




    public long getDataCenterId() {
        return dataCenterId;
    }




    public void setDataCenterId(long dataCenterIdToDeployIn) {
        this.dataCenterId = dataCenterIdToDeployIn;
    }


    public boolean limitCpuUse() {
        return limitCpuUse;
    }

    public void setLimitCpuUse(boolean value) {
        limitCpuUse = value;
    }


    public String getDataCenterUuid() {
        return dataCenterUuid;
    }




    public void setDataCenterUuid(String zoneUuid) {
        this.dataCenterUuid = zoneUuid;
    }




    public String getDataCenterName() {
        return dataCenterName;
    }


    public void setDataCenterName(String zoneName) {
        this.dataCenterName = zoneName;
    }
   
    
    public String getDataCenterType() {
        return dataCenterType;
    }


    public void setDataCenterType(String zoneType) {
        this.dataCenterType = zoneType;
    }   
    

    public boolean isSecurityGroupEnabled() {
        return securityGroupEnabled;
    }


    public void setSecurityGroupEnabled(boolean securityGroupEnabled) {
        this.securityGroupEnabled = securityGroupEnabled;
    }


    public Long getHostId() {
        return hostId;
    }


    public void setHostId(long hostId) {
        this.hostId = hostId;
    }


    public String getHostUuid() {
        return hostUuid;
    }




    public void setHostUuid(String hostUuid) {
        this.hostUuid = hostUuid;
    }




    public String getHostName() {
        return hostName;
    }


    public void setHostName(String hostName) {
        this.hostName = hostName;
    }


    public long getTemplateId() {
        return templateId;
    }


    public void setTemplateId(long templateId) {
        this.templateId = templateId;
    }



    public String getTemplateUuid() {
        return templateUuid;
    }




    public void setTemplateUuid(String templateUuid) {
        this.templateUuid = templateUuid;
    }




    public String getTemplateName() {
        return templateName;
    }


    public void setTemplateName(String templateName) {
        this.templateName = templateName;
    }


    public String getTemplateDisplayText() {
        return templateDisplayText;
    }


    public void setTemplateDisplayText(String templateDisplayText) {
        this.templateDisplayText = templateDisplayText;
    }


    public boolean isPasswordEnabled() {
        return passwordEnabled;
    }


    public void setPasswordEnabled(boolean passwordEnabled) {
        this.passwordEnabled = passwordEnabled;
    }


    public Long getIsoId() {
        return isoId;
    }


    public void setIsoId(long isoId) {
        this.isoId = isoId;
    }


    public String getIsoUuid() {
        return isoUuid;
    }




    public void setIsoUuid(String isoUuid) {
        this.isoUuid = isoUuid;
    }




    public String getIsoName() {
        return isoName;
    }


    public void setIsoName(String isoName) {
        this.isoName = isoName;
    }


    public String getIsoDisplayText() {
        return isoDisplayText;
    }

    public void setIsoDisplayText(String isoDisplayText) {
        this.isoDisplayText = isoDisplayText;
    }




    public String getServiceOfferingUuid() {
        return serviceOfferingUuid;
    }




    public void setServiceOfferingUuid(String serviceOfferingUuid) {
        this.serviceOfferingUuid = serviceOfferingUuid;
    }




    public String getServiceOfferingName() {
        return serviceOfferingName;
    }


    public void setServiceOfferingName(String serviceOfferingName) {
        this.serviceOfferingName = serviceOfferingName;
    }


    public int getCpu() {
        return cpu;
    }


    public void setCpu(int cpu) {
        this.cpu = cpu;
    }


    public int getSpeed() {
        return speed;
    }


    public void setSpeed(int speed) {
        this.speed = speed;
    }


    public int getRamSize() {
        return ramSize;
    }


    public void setRamSize(int ramSize) {
        this.ramSize = ramSize;
    }


    public long getPoolId() {
        return poolId;
    }


    public void setPoolId(long poolId) {
        this.poolId = poolId;
    }


    public StoragePoolType getPoolType() {
        return poolType;
    }


    public void setPoolType(StoragePoolType poolType) {
        this.poolType = poolType;
    }


    public long getVolume_id() {
        return volume_id;
    }


    public void setVolume_id(long volume_id) {
        this.volume_id = volume_id;
    }


    public Long getVolumeDeviceId() {
        return volumeDeviceId;
    }


    public void setVolumeDeviceId(Long volumeDeviceId) {
        this.volumeDeviceId = volumeDeviceId;
    }


    public Volume.Type getVolumeType() {
        return volumeType;
    }


    public void setVolumeType(Volume.Type volumeType) {
        this.volumeType = volumeType;
    }


    public long getSecurityGroupId() {
        return securityGroupId;
    }


    public void setSecurityGroupId(long securityGroupId) {
        this.securityGroupId = securityGroupId;
    }


    public String getSecurityGroupName() {
        return securityGroupName;
    }


    public void setSecurityGroupName(String securityGroupName) {
        this.securityGroupName = securityGroupName;
    }


    public String getSecurityGroupDescription() {
        return securityGroupDescription;
    }


    public void setSecurityGroupDescription(String securityGroupDescription) {
        this.securityGroupDescription = securityGroupDescription;
    }


    public long getVpcId() {
        return vpcId;
    }



    public void setVpcId(long vpcId) {
        this.vpcId = vpcId;
    }




    public long getNicId() {
        return nicId;
    }


    public void setNicId(long nicId) {
        this.nicId = nicId;
    }


    public boolean isDefaultNic() {
        return isDefaultNic;
    }


    public void setDefaultNic(boolean isDefaultNic) {
        this.isDefaultNic = isDefaultNic;
    }


    public String getIpAddress() {
        return ipAddress;
    }


    public void setIpAddress(String ipAddress) {
        this.ipAddress = ipAddress;
    }


    public String getGateway() {
        return gateway;
    }


    public void setGateway(String gateway) {
        this.gateway = gateway;
    }


    public String getNetmask() {
        return netmask;
    }


    public void setNetmask(String netmask) {
        this.netmask = netmask;
    }


    public String getMacAddress() {
        return macAddress;
    }


    public void setMacAddress(String macAddress) {
        this.macAddress = macAddress;
    }


    public URI getBroadcastUri() {
        return broadcastUri;
    }


    public void setBroadcastUri(URI broadcastUri) {
        this.broadcastUri = broadcastUri;
    }


    public URI getIsolationUri() {
        return isolationUri;
    }


    public void setIsolationUri(URI isolationUri) {
        this.isolationUri = isolationUri;
    }


    public long getNetworkId() {
        return networkId;
    }


    public void setNetworkId(long networkId) {
        this.networkId = networkId;
    }


    public String getNetworkName() {
        return networkName;
    }


    public void setNetworkName(String networkName) {
        this.networkName = networkName;
    }


    public TrafficType getTrafficType() {
        return trafficType;
    }


    public void setTrafficType(TrafficType trafficType) {
        this.trafficType = trafficType;
    }


    public GuestType getGuestType() {
        return guestType;
    }


    public void setGuestType(GuestType guestType) {
        this.guestType = guestType;
    }


    public long getPublicIpId() {
        return publicIpId;
    }




    public void setPublicIpId(long publicIpId) {
        this.publicIpId = publicIpId;
    }




    public String getPublicIpAddress() {
        return publicIpAddress;
    }


    public void setPublicIpAddress(String publicIpAddress) {
        this.publicIpAddress = publicIpAddress;
    }



    public long getServiceOfferingId() {
        return serviceOfferingId;
    }




    public void setServiceOfferingId(long serviceOfferingId) {
        this.serviceOfferingId = serviceOfferingId;
    }


    public Map<String, String> getDetails() {
        return details;
    }

    public String getDetail(String name) {
        assert (details != null) : "Did you forget to load the details?";

        return details != null ? details.get(name) : null;
    }

    public void setDetail(String name, String value) {
        assert (details != null) : "Did you forget to load the details?";

        details.put(name, value);
    }

    public void setDetails(Map<String, String> details) {
        this.details = details;
    }

    public void setUserData(String userData) {
        this.userData = userData;
    }

    public String getUserData() {
        return userData;
    }



    public long getGuestOsId() {
        return guestOsId;
    }




    public void setGuestOsId(long guestOsId) {
        this.guestOsId = guestOsId;
    }




    public long getProjectId() {
        return projectId;
    }




    public void setProjectId(long projectId) {
        this.projectId = projectId;
    }




    @Override
    public String getProjectUuid() {
        return projectUuid;
    }




    public void setProjectUuid(String projectUuid) {
        this.projectUuid = projectUuid;
    }




    @Override
    public String getProjectName() {
        return projectName;
    }




    public void setProjectName(String projectName) {
        this.projectName = projectName;
    }




    public String getKeypairName() {
        return keypairName;
    }




    public void setKeypairName(String keypairName) {
        this.keypairName = keypairName;
    }




    public long getTagId() {
        return tagId;
    }




    public void setTagId(long tagId) {
        this.tagId = tagId;
    }




    public String getTagUuid() {
        return tagUuid;
    }




    public void setTagUuid(String tagUuid) {
        this.tagUuid = tagUuid;
    }




    public String getTagKey() {
        return tagKey;
    }




    public void setTagKey(String tagKey) {
        this.tagKey = tagKey;
    }




    public String getTagValue() {
        return tagValue;
    }




    public void setTagValue(String tagValue) {
        this.tagValue = tagValue;
    }




    public long getTagDomainId() {
        return tagDomainId;
    }




    public void setTagDomainId(long tagDomainId) {
        this.tagDomainId = tagDomainId;
    }




    public long getTagAccountId() {
        return tagAccountId;
    }




    public void setTagAccountId(long tagAccountId) {
        this.tagAccountId = tagAccountId;
    }




    public long getTagResourceId() {
        return tagResourceId;
    }




    public void setTagResourceId(long tagResourceId) {
        this.tagResourceId = tagResourceId;
    }




    public String getTagResourceUuid() {
        return tagResourceUuid;
    }




    public void setTagResourceUuid(String tagResourceUuid) {
        this.tagResourceUuid = tagResourceUuid;
    }




    public TaggedResourceType getTagResourceType() {
        return tagResourceType;
    }




    public void setTagResourceType(TaggedResourceType tagResourceType) {
        this.tagResourceType = tagResourceType;
    }




    public String getTagCustomer() {
        return tagCustomer;
    }




    public void setTagCustomer(String tagCustomer) {
        this.tagCustomer = tagCustomer;
    }




    public boolean isLimitCpuUse() {
        return limitCpuUse;
    }



    public String getPoolUuid() {
        return poolUuid;
    }




    public void setPoolUuid(String poolUuid) {
        this.poolUuid = poolUuid;
    }




    public String getVolume_uuid() {
        return volume_uuid;
    }




    public void setVolume_uuid(String volume_uuid) {
        this.volume_uuid = volume_uuid;
    }




    public String getSecurityGroupUuid() {
        return securityGroupUuid;
    }




    public void setSecurityGroupUuid(String securityGroupUuid) {
        this.securityGroupUuid = securityGroupUuid;
    }




    public String getVpcUuid() {
        return vpcUuid;
    }




    public void setVpcUuid(String vpcUuid) {
        this.vpcUuid = vpcUuid;
    }




    public String getNicUuid() {
        return nicUuid;
    }




    public void setNicUuid(String nicUuid) {
        this.nicUuid = nicUuid;
    }




    public String getNetworkUuid() {
        return networkUuid;
    }




    public void setNetworkUuid(String networkUuid) {
        this.networkUuid = networkUuid;
    }




    public String getPublicIpUuid() {
        return publicIpUuid;
    }




    public void setPublicIpUuid(String publicIpUuid) {
        this.publicIpUuid = publicIpUuid;
    }



    public Long getJobId() {
        return jobId;
    }




    public void setJobId(Long jobId) {
        this.jobId = jobId;
    }




    public String getJobUuid() {
        return jobUuid;
    }




    public void setJobUuid(String jobUuid) {
        this.jobUuid = jobUuid;
    }




    public int getJobStatus() {
        return jobStatus;
    }




    public void setJobStatus(int jobStatus) {
        this.jobStatus = jobStatus;
    }



    transient String toString;
    @Override
    public String toString() {
        if (toString == null) {
            toString = new StringBuilder("VM[").append(id).append("|").append(hostName).append("]").toString();
        }
        return toString;
    }

	public String getIp6Address() {
		return ip6Address;
	}




	public void setIp6Address(String ip6Address) {
		this.ip6Address = ip6Address;
	}




	public String getIp6Gateway() {
		return ip6Gateway;
	}




	public void setIp6Gateway(String ip6Gateway) {
		this.ip6Gateway = ip6Gateway;
	}




	public String getIp6Cidr() {
		return ip6Cidr;
	}




	public void setIp6Cidr(String ip6Cidr) {
		this.ip6Cidr = ip6Cidr;
	}


    public long getAffinityGroupId() {
        return affinityGroupId;
    }



    public String getAffinityGroupUuid() {
        return affinityGroupUuid;
    }



    public String getAffinityGroupName() {
        return affinityGroupName;
    }



    public String getAffinityGroupDescription() {
        return affinityGroupDescription;
    }


}
