// Copyright 2012 Citrix Systems, Inc. Licensed under the
// Apache License, Version 2.0 (the "License"); you may not use this
// file except in compliance with the License.  Citrix Systems, Inc.
// reserves all rights not expressly granted by 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.
// 
// Automatically generated by addcopyright.py at 04/03/2012
package com.cloud.dc;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name="op_dc_link_local_ip_address_alloc")
public class DataCenterLinkLocalIpAddressVO {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    long id;
    
    @Column(name="ip_address", updatable=false, nullable=false)
    String ipAddress;
    
    @Column(name="taken")
    @Temporal(value=TemporalType.TIMESTAMP)
    private Date takenAt;
    
    @Column(name="data_center_id", updatable=false, nullable=false)
    private long dataCenterId;
    
    @Column(name="pod_id", updatable=false, nullable=false)
    private long podId;
    
    @Column(name="nic_id")
    private Long instanceId;
    
    @Column(name="reservation_id")
    private String reservationId;
    
    protected DataCenterLinkLocalIpAddressVO() {
    }
    
    public DataCenterLinkLocalIpAddressVO(String ipAddress, long dataCenterId, long podId) {
        this.ipAddress = ipAddress;
        this.dataCenterId = dataCenterId;
        this.podId = podId;
    }
    
    public Long getId() {
        return id;
    }
    
    public Long getInstanceId() {
    	return instanceId;
    }
    
    public void setInstanceId(Long instanceId) {
    	this.instanceId = instanceId;
    }

    public long getPodId() {
        return podId;
    }

    public void setTakenAt(Date takenDate) {
        this.takenAt = takenDate;
    }
    
    public void setReservationId(String reservationId) {
        this.reservationId = reservationId;
    }
    
    public String getReservationId() {
        return reservationId;
    }

    public String getIpAddress() {
        return ipAddress;
    }
    
    public long getDataCenterId() {
        return dataCenterId;
    }

    public Date getTakenAt() {
        return takenAt;
    }
}
