package pta.de.api;

import com.fasterxml.jackson.annotation.JsonProperty;
import org.hibernate.validator.constraints.NotEmpty;


public class ServiceDistributionCluster {

    public static class ServiceDistribution {

        public boolean active;

        @NotEmpty
        public String name;

        @NotEmpty
        public String host;

        @NotEmpty
        public String protocol;

        @NotEmpty
        public int portApp;

        public int portHealth;

        public String description;

        public ServiceDistribution() {
        }

        @JsonProperty
        public boolean isActive() {
            return active;
        }

        @JsonProperty
        public void setActive(boolean active) {
            this.active = active;
        }

        @JsonProperty
        public String getName() {
            return name;
        }

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

        @JsonProperty
        public String getHost() {
            return host;
        }

        @JsonProperty
        public void setHost(String host) {
            this.host = host;
        }

        @JsonProperty
        public String getProtocol() {
            return protocol;
        }

        @JsonProperty
        public void setProtocol(String protocol) {
            this.protocol = protocol;
        }

        @JsonProperty
        public int getPortApp() {
            return portApp;
        }

        @JsonProperty
        public void setPortApp(int portApp) {
            this.portApp = portApp;
        }

        @JsonProperty
        public String getDescription() {
            return description;
        }

        @JsonProperty
        public void setDescription(String description) {
            this.description = description;
        }

        @JsonProperty
        public int getPortHealth() {
            return portHealth;
        }

        @JsonProperty
        public void setPortHealth(int portHealth) {
            this.portHealth = portHealth;
        }
    }

    public boolean active;

    @NotEmpty
    public String clustername;

    public String description;

    ServiceDistribution[] distributions;

    @JsonProperty
    public boolean isActive() {
        return active;
    }

    @JsonProperty
    public void setActive(boolean active) {
        this.active = active;
    }

    @JsonProperty
    public String getClustername() {
        return clustername;
    }

    @JsonProperty
    public void setClustername(String clustername) {
        this.clustername = clustername;
    }

    @JsonProperty
    public String getDescription() {
        return description;
    }

    @JsonProperty
    public void setDescription(String description) {
        this.description = description;
    }

    public ServiceDistribution[] getDistributions() {
        return distributions;
    }

    public void setDistributions(ServiceDistribution[] distributions) {
        this.distributions = distributions;
    }
}
