/*
 * 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 org.apache.ambari.server.agent;

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonProperty;

/**
 *
 * Data model for Ambari Agent to send hardware profile to Ambari Server.
 *
 */
public class HostInfo {
  private String architecture;
  private String domain;
  private String fqdn;
  private String hardwareisa;
  private String hardwaremodel;
  private String hostname;
  private String id;
  private String interfaces;
  private String ipaddress;
  private String kernel;
  private String kernelmajversion;
  private String kernelrelease;
  private String kernelversion;
  private String macaddress;
  private long memoryfree;
  private long memorysize;
  private List<DiskInfo> mounts = new ArrayList<>();
  private long memorytotal;
  private String netmask;
  private String operatingsystem;
  private String operatingsystemrelease;
  private String osfamily;
  private int physicalprocessorcount;
  private int processorcount;
  private boolean selinux;
  private String swapfree;
  private String swapsize;
  private String timezone;
  private String uptime;
  private long uptime_days;
  private long uptime_hours;


  @JsonProperty("architecture")
  public String getArchitecture() {
    return this.architecture;
  }

  @JsonProperty("architecture")
  public void setArchitecture(String architecture) {
    this.architecture = architecture;
  }

  @JsonProperty("domain")
  public String getDomain() {
    return this.domain;
  }

  @JsonProperty("domain")
  public void setDomain(String domain) {
    this.domain = domain;
  }

  @JsonProperty("fqdn")
  public String getFQDN() {
    return this.fqdn;
  }

  @JsonProperty("fqdn")
  public void setFQDN(String fqdn) {
    this.fqdn = fqdn;
  }

  @JsonProperty("hardwareisa")
  public String getHardwareIsa() {
    return hardwareisa;
  }

  @JsonProperty("hardwareisa")
  public void setHardwareIsa(String hardwareisa) {
    this.hardwareisa = hardwareisa;
  }

  @JsonProperty("hardwaremodel")
  public String getHardwareModel() {
    return this.hardwaremodel;
  }

  @JsonProperty("hardwaremodel")
  public void setHardwareModel(String hardwaremodel) {
    this.hardwaremodel = hardwaremodel;
  }

  @JsonProperty("hostname")
  public String getHostName() {
    return this.hostname;
  }

  @JsonProperty("hostname")
  public void setHostName(String hostname) {
    this.hostname = hostname;
  }

  @JsonProperty("id")
  public String getAgentUserId() {
    return id;
  }

  @JsonProperty("id")
  public void setAgentUserId(String id) {
    this.id = id;
  }

  @JsonProperty("interfaces")
  public String getInterfaces() {
    return this.interfaces;
  }

  @JsonProperty("interfaces")
  public void setInterfaces(String interfaces) {
    this.interfaces = interfaces;
  }

  @JsonProperty("ipaddress")
  public String getIPAddress() {
    return this.ipaddress;
  }

  @JsonProperty("ipaddress")
  public void setIPAddress(String ipaddress) {
    this.ipaddress = ipaddress;
  }

  @JsonProperty("kernel")
  public String getKernel() {
    return this.kernel;
  }

  @JsonProperty("kernel")
  public void setKernel(String kernel) {
    this.kernel = kernel;
  }

  @JsonProperty("kernelmajversion")
  public String getKernelMajVersion() {
    return this.kernelmajversion;
  }

  @JsonProperty("kernelmajversion")
  public void setKernelMajVersion(String kernelmajversion) {
    this.kernelmajversion = kernelmajversion;
  }

  @JsonProperty("kernelrelease")
  public String getKernelRelease() {
    return this.kernelrelease;
  }

  @JsonProperty("kernelrelease")
  public void setKernelRelease(String kernelrelease) {
    this.kernelrelease = kernelrelease;
  }

  @JsonProperty("kernelversion")
  public String getKernelVersion() {
    return this.kernelversion;
  }

  @JsonProperty("kernelversion")
  public void setKernelVersion(String kernelversion) {
    this.kernelversion = kernelversion;
  }

  @JsonProperty("macaddress")
  public String getMacAddress() {
    return this.macaddress;
  }

  @JsonProperty("macaddress")
  public void setMacAddress(String macaddress) {
    this.macaddress = macaddress;
  }

  @JsonProperty("memoryfree")
  public long getFreeMemory() {
    return this.memoryfree;
  }

  @JsonProperty("memoryfree")
  public void setFreeMemory(long memoryfree) {
    this.memoryfree = memoryfree;
  }

  @JsonProperty("memorysize")
  public long getMemorySize() {
    return this.memorysize;
  }

  @JsonProperty("memorysize")
  public void setMemorySize(long memorysize) {
    this.memorysize = memorysize;
  }

  @JsonProperty("mounts")
  public List<DiskInfo> getMounts() {
    return this.mounts;
  }

  @JsonProperty("mounts")
  public void setMounts(List<DiskInfo> mounts) {
    this.mounts = mounts;
  }

  @JsonProperty("memorytotal")
  public long getMemoryTotal() {
    return this.memorytotal;
  }

  @JsonProperty("memorytotal")
  public void setMemoryTotal(long memorytotal) {
    this.memorytotal = memorytotal;
  }

  @JsonProperty("netmask")
  public String getNetMask() {
    return this.netmask;
  }

  @JsonProperty("netmask")
  public void setNetMask(String netmask) {
    this.netmask = netmask;
  }

  @JsonProperty("operatingsystem")
  public String getOS() {
    return this.operatingsystem;
  }

  @JsonProperty("operatingsystem")
  public void setOS(String operatingsystem) {
    this.operatingsystem = operatingsystem;
  }

  @JsonProperty("operatingsystemrelease")
  public String getOSRelease() {
    return this.operatingsystemrelease;
  }

  @JsonProperty("operatingsystemrelease")
  public void setOSRelease(String operatingsystemrelease) {
    this.operatingsystemrelease = operatingsystemrelease;
  }

  @JsonProperty("osfamily")
  public String getOSFamily() {
    return this.osfamily;
  }

  @JsonProperty("osfamily")
  public void setOSFamily(String osfamily) {
    this.osfamily = osfamily;
  }

  @JsonProperty("physicalprocessorcount")
  public int getPhysicalProcessorCount() {
    return this.physicalprocessorcount;
  }

  @JsonProperty("physicalprocessorcount")
  public void setPhysicalProcessorCount(int physicalprocessorcount) {
    this.physicalprocessorcount = physicalprocessorcount;
  }

  @JsonProperty("processorcount")
  public int getProcessorCount() {
    return this.processorcount;
  }

  @JsonProperty("processorcount")
  public void setProcessorCount(int processorcount) {
    this.processorcount = processorcount;
  }

  @JsonProperty("selinux")
  public boolean getSeLinux() {
    return selinux;
  }

  @JsonProperty("selinux")
  public void setSeLinux(boolean selinux) {
    this.selinux = selinux;
  }

  @JsonProperty("swapfree")
  public String getSwapFree() {
    return this.swapfree;
  }

  @JsonProperty("swapfree")
  public void setSwapFree(String swapfree) {
    this.swapfree = swapfree;
  }

  @JsonProperty("swapsize")
  public String getSwapSize() {
    return swapsize;
  }

  @JsonProperty("swapsize")
  public void setSwapSize(String swapsize) {
    this.swapsize = swapsize;
  }

  @JsonProperty("timezone")
  public String getTimeZone() {
    return this.timezone;
  }

  @JsonProperty("timezone")
  public void setTimeZone(String timezone) {
    this.timezone = timezone;
  }

  @JsonProperty("uptime")
  public String getUptime() {
    return this.uptime;
  }

  @JsonProperty("uptime")
  public void setUpTime(String uptime) {
    this.uptime = uptime;
  }

  @JsonProperty("uptime_hours")
  public long getUptimeHours() {
    return this.uptime_hours;
  }

  @JsonProperty("uptime_hours")
  public void setUpTimeHours(long uptime_hours) {
    this.uptime_hours = uptime_hours;
  }

  @JsonProperty("uptime_days")
  public long getUpTimeDays() {
    return this.uptime_days;
  }

  @JsonProperty("uptime_days")
  public void setUpTimeDays(long uptime_days) {
    this.uptime_days = uptime_days;
  }

  private String getDiskString() {
    if (mounts == null) {
      return null;
    }
    StringBuilder ret = new StringBuilder();
    for (DiskInfo diskInfo : mounts) {
      ret.append("(").append(diskInfo).append(")");
    }
    return ret.toString();
  }

  @Override
  public String toString() {
    return "[" +
        "hostname=" + this.hostname + "," +
        "fqdn=" + this.fqdn + "," +
        "domain=" + this.domain + "," +
        "architecture=" + this.architecture + "," +
        "processorcount=" + this.processorcount + "," +
        "physicalprocessorcount=" + this.physicalprocessorcount + "," +
        "osname=" + this.operatingsystem + "," +
        "osversion=" + this.operatingsystemrelease + "," +
        "osfamily=" + this.osfamily + "," +
        "memory=" + this.memorytotal + "," +
        "uptime_hours=" + this.uptime_hours + "," +
        "mounts=" + getDiskString() + "]\n";
  }
}
