/*-
 * ============LICENSE_START=======================================================
 * OSAM Core
 * ================================================================================
 * Copyright (C) 2018 Netsia
 * ================================================================================
 * 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.
 * ============LICENSE_END=========================================================
 */



package org.onap.osam.common.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonRootName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonRootName("Chassis")
@JsonInclude(JsonInclude.Include.NON_NULL)
@ApiModel
public class ChassisDTO {
    @ApiModelProperty(hidden = true)
    private Long id;
    @ApiModelProperty(required = true, value="CLLI of the chassis")
    private String clli;
    @ApiModelProperty(required = true, value="PNF ID of the POD on top of which this chassis is registered")
    private String pnfId;
    @ApiModelProperty(required = true, value="Shelf number for this chassis")
    private int shelf;
    @ApiModelProperty(required = true, value="Rack number for this chassis")
    private int rack;
    @ApiModelProperty(hidden = true)
    private List<OLTChassisDTO> olts;
}
