/*
 * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with
 * the License. A copy of the License is located at
 * 
 * http://aws.amazon.com/apache2.0
 * 
 * or in the "license" file accompanying this file. This file 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.amazonaws.services.fsx.model;

import java.io.Serializable;
import javax.annotation.Generated;
import com.amazonaws.protocol.StructuredPojo;
import com.amazonaws.protocol.ProtocolMarshaller;

/**
 * <p>
 * The configuration for Lustre root squash used to restrict root-level access from clients that try to access your FSx
 * for Lustre file system as root. Use the <code>RootSquash</code> parameter to enable root squash. To learn more about
 * Lustre root squash, see <a href="https://docs.aws.amazon.com/fsx/latest/LustreGuide/root-squash.html">Lustre root
 * squash</a>.
 * </p>
 * <p>
 * You can also use the <code>NoSquashNids</code> parameter to provide an array of clients who are not affected by the
 * root squash setting. These clients will access the file system as root, with unrestricted privileges.
 * </p>
 * 
 * @see <a href="http://docs.aws.amazon.com/goto/WebAPI/fsx-2018-03-01/LustreRootSquashConfiguration" target="_top">AWS
 *      API Documentation</a>
 */
@Generated("com.amazonaws:aws-java-sdk-code-generator")
public class LustreRootSquashConfiguration implements Serializable, Cloneable, StructuredPojo {

    /**
     * <p>
     * You enable root squash by setting a user ID (UID) and group ID (GID) for the file system in the format
     * <code>UID:GID</code> (for example, <code>365534:65534</code>). The UID and GID values can range from
     * <code>0</code> to <code>4294967294</code>:
     * </p>
     * <ul>
     * <li>
     * <p>
     * A non-zero value for UID and GID enables root squash. The UID and GID values can be different, but each must be a
     * non-zero value.
     * </p>
     * </li>
     * <li>
     * <p>
     * A value of <code>0</code> (zero) for UID and GID indicates root, and therefore disables root squash.
     * </p>
     * </li>
     * </ul>
     * <p>
     * When root squash is enabled, the user ID and group ID of a root user accessing the file system are re-mapped to
     * the UID and GID you provide.
     * </p>
     */
    private String rootSquash;
    /**
     * <p>
     * When root squash is enabled, you can optionally specify an array of NIDs of clients for which root squash does
     * not apply. A client NID is a Lustre Network Identifier used to uniquely identify a client. You can specify the
     * NID as either a single address or a range of addresses:
     * </p>
     * <ul>
     * <li>
     * <p>
     * A single address is described in standard Lustre NID format by specifying the client’s IP address followed by the
     * Lustre network ID (for example, <code>10.0.1.6@tcp</code>).
     * </p>
     * </li>
     * <li>
     * <p>
     * An address range is described using a dash to separate the range (for example,
     * <code>10.0.[2-10].[1-255]@tcp</code>).
     * </p>
     * </li>
     * </ul>
     */
    private java.util.List<String> noSquashNids;

    /**
     * <p>
     * You enable root squash by setting a user ID (UID) and group ID (GID) for the file system in the format
     * <code>UID:GID</code> (for example, <code>365534:65534</code>). The UID and GID values can range from
     * <code>0</code> to <code>4294967294</code>:
     * </p>
     * <ul>
     * <li>
     * <p>
     * A non-zero value for UID and GID enables root squash. The UID and GID values can be different, but each must be a
     * non-zero value.
     * </p>
     * </li>
     * <li>
     * <p>
     * A value of <code>0</code> (zero) for UID and GID indicates root, and therefore disables root squash.
     * </p>
     * </li>
     * </ul>
     * <p>
     * When root squash is enabled, the user ID and group ID of a root user accessing the file system are re-mapped to
     * the UID and GID you provide.
     * </p>
     * 
     * @param rootSquash
     *        You enable root squash by setting a user ID (UID) and group ID (GID) for the file system in the format
     *        <code>UID:GID</code> (for example, <code>365534:65534</code>). The UID and GID values can range from
     *        <code>0</code> to <code>4294967294</code>:</p>
     *        <ul>
     *        <li>
     *        <p>
     *        A non-zero value for UID and GID enables root squash. The UID and GID values can be different, but each
     *        must be a non-zero value.
     *        </p>
     *        </li>
     *        <li>
     *        <p>
     *        A value of <code>0</code> (zero) for UID and GID indicates root, and therefore disables root squash.
     *        </p>
     *        </li>
     *        </ul>
     *        <p>
     *        When root squash is enabled, the user ID and group ID of a root user accessing the file system are
     *        re-mapped to the UID and GID you provide.
     */

    public void setRootSquash(String rootSquash) {
        this.rootSquash = rootSquash;
    }

    /**
     * <p>
     * You enable root squash by setting a user ID (UID) and group ID (GID) for the file system in the format
     * <code>UID:GID</code> (for example, <code>365534:65534</code>). The UID and GID values can range from
     * <code>0</code> to <code>4294967294</code>:
     * </p>
     * <ul>
     * <li>
     * <p>
     * A non-zero value for UID and GID enables root squash. The UID and GID values can be different, but each must be a
     * non-zero value.
     * </p>
     * </li>
     * <li>
     * <p>
     * A value of <code>0</code> (zero) for UID and GID indicates root, and therefore disables root squash.
     * </p>
     * </li>
     * </ul>
     * <p>
     * When root squash is enabled, the user ID and group ID of a root user accessing the file system are re-mapped to
     * the UID and GID you provide.
     * </p>
     * 
     * @return You enable root squash by setting a user ID (UID) and group ID (GID) for the file system in the format
     *         <code>UID:GID</code> (for example, <code>365534:65534</code>). The UID and GID values can range from
     *         <code>0</code> to <code>4294967294</code>:</p>
     *         <ul>
     *         <li>
     *         <p>
     *         A non-zero value for UID and GID enables root squash. The UID and GID values can be different, but each
     *         must be a non-zero value.
     *         </p>
     *         </li>
     *         <li>
     *         <p>
     *         A value of <code>0</code> (zero) for UID and GID indicates root, and therefore disables root squash.
     *         </p>
     *         </li>
     *         </ul>
     *         <p>
     *         When root squash is enabled, the user ID and group ID of a root user accessing the file system are
     *         re-mapped to the UID and GID you provide.
     */

    public String getRootSquash() {
        return this.rootSquash;
    }

    /**
     * <p>
     * You enable root squash by setting a user ID (UID) and group ID (GID) for the file system in the format
     * <code>UID:GID</code> (for example, <code>365534:65534</code>). The UID and GID values can range from
     * <code>0</code> to <code>4294967294</code>:
     * </p>
     * <ul>
     * <li>
     * <p>
     * A non-zero value for UID and GID enables root squash. The UID and GID values can be different, but each must be a
     * non-zero value.
     * </p>
     * </li>
     * <li>
     * <p>
     * A value of <code>0</code> (zero) for UID and GID indicates root, and therefore disables root squash.
     * </p>
     * </li>
     * </ul>
     * <p>
     * When root squash is enabled, the user ID and group ID of a root user accessing the file system are re-mapped to
     * the UID and GID you provide.
     * </p>
     * 
     * @param rootSquash
     *        You enable root squash by setting a user ID (UID) and group ID (GID) for the file system in the format
     *        <code>UID:GID</code> (for example, <code>365534:65534</code>). The UID and GID values can range from
     *        <code>0</code> to <code>4294967294</code>:</p>
     *        <ul>
     *        <li>
     *        <p>
     *        A non-zero value for UID and GID enables root squash. The UID and GID values can be different, but each
     *        must be a non-zero value.
     *        </p>
     *        </li>
     *        <li>
     *        <p>
     *        A value of <code>0</code> (zero) for UID and GID indicates root, and therefore disables root squash.
     *        </p>
     *        </li>
     *        </ul>
     *        <p>
     *        When root squash is enabled, the user ID and group ID of a root user accessing the file system are
     *        re-mapped to the UID and GID you provide.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public LustreRootSquashConfiguration withRootSquash(String rootSquash) {
        setRootSquash(rootSquash);
        return this;
    }

    /**
     * <p>
     * When root squash is enabled, you can optionally specify an array of NIDs of clients for which root squash does
     * not apply. A client NID is a Lustre Network Identifier used to uniquely identify a client. You can specify the
     * NID as either a single address or a range of addresses:
     * </p>
     * <ul>
     * <li>
     * <p>
     * A single address is described in standard Lustre NID format by specifying the client’s IP address followed by the
     * Lustre network ID (for example, <code>10.0.1.6@tcp</code>).
     * </p>
     * </li>
     * <li>
     * <p>
     * An address range is described using a dash to separate the range (for example,
     * <code>10.0.[2-10].[1-255]@tcp</code>).
     * </p>
     * </li>
     * </ul>
     * 
     * @return When root squash is enabled, you can optionally specify an array of NIDs of clients for which root squash
     *         does not apply. A client NID is a Lustre Network Identifier used to uniquely identify a client. You can
     *         specify the NID as either a single address or a range of addresses:</p>
     *         <ul>
     *         <li>
     *         <p>
     *         A single address is described in standard Lustre NID format by specifying the client’s IP address
     *         followed by the Lustre network ID (for example, <code>10.0.1.6@tcp</code>).
     *         </p>
     *         </li>
     *         <li>
     *         <p>
     *         An address range is described using a dash to separate the range (for example,
     *         <code>10.0.[2-10].[1-255]@tcp</code>).
     *         </p>
     *         </li>
     */

    public java.util.List<String> getNoSquashNids() {
        return noSquashNids;
    }

    /**
     * <p>
     * When root squash is enabled, you can optionally specify an array of NIDs of clients for which root squash does
     * not apply. A client NID is a Lustre Network Identifier used to uniquely identify a client. You can specify the
     * NID as either a single address or a range of addresses:
     * </p>
     * <ul>
     * <li>
     * <p>
     * A single address is described in standard Lustre NID format by specifying the client’s IP address followed by the
     * Lustre network ID (for example, <code>10.0.1.6@tcp</code>).
     * </p>
     * </li>
     * <li>
     * <p>
     * An address range is described using a dash to separate the range (for example,
     * <code>10.0.[2-10].[1-255]@tcp</code>).
     * </p>
     * </li>
     * </ul>
     * 
     * @param noSquashNids
     *        When root squash is enabled, you can optionally specify an array of NIDs of clients for which root squash
     *        does not apply. A client NID is a Lustre Network Identifier used to uniquely identify a client. You can
     *        specify the NID as either a single address or a range of addresses:</p>
     *        <ul>
     *        <li>
     *        <p>
     *        A single address is described in standard Lustre NID format by specifying the client’s IP address followed
     *        by the Lustre network ID (for example, <code>10.0.1.6@tcp</code>).
     *        </p>
     *        </li>
     *        <li>
     *        <p>
     *        An address range is described using a dash to separate the range (for example,
     *        <code>10.0.[2-10].[1-255]@tcp</code>).
     *        </p>
     *        </li>
     */

    public void setNoSquashNids(java.util.Collection<String> noSquashNids) {
        if (noSquashNids == null) {
            this.noSquashNids = null;
            return;
        }

        this.noSquashNids = new java.util.ArrayList<String>(noSquashNids);
    }

    /**
     * <p>
     * When root squash is enabled, you can optionally specify an array of NIDs of clients for which root squash does
     * not apply. A client NID is a Lustre Network Identifier used to uniquely identify a client. You can specify the
     * NID as either a single address or a range of addresses:
     * </p>
     * <ul>
     * <li>
     * <p>
     * A single address is described in standard Lustre NID format by specifying the client’s IP address followed by the
     * Lustre network ID (for example, <code>10.0.1.6@tcp</code>).
     * </p>
     * </li>
     * <li>
     * <p>
     * An address range is described using a dash to separate the range (for example,
     * <code>10.0.[2-10].[1-255]@tcp</code>).
     * </p>
     * </li>
     * </ul>
     * <p>
     * <b>NOTE:</b> This method appends the values to the existing list (if any). Use
     * {@link #setNoSquashNids(java.util.Collection)} or {@link #withNoSquashNids(java.util.Collection)} if you want to
     * override the existing values.
     * </p>
     * 
     * @param noSquashNids
     *        When root squash is enabled, you can optionally specify an array of NIDs of clients for which root squash
     *        does not apply. A client NID is a Lustre Network Identifier used to uniquely identify a client. You can
     *        specify the NID as either a single address or a range of addresses:</p>
     *        <ul>
     *        <li>
     *        <p>
     *        A single address is described in standard Lustre NID format by specifying the client’s IP address followed
     *        by the Lustre network ID (for example, <code>10.0.1.6@tcp</code>).
     *        </p>
     *        </li>
     *        <li>
     *        <p>
     *        An address range is described using a dash to separate the range (for example,
     *        <code>10.0.[2-10].[1-255]@tcp</code>).
     *        </p>
     *        </li>
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public LustreRootSquashConfiguration withNoSquashNids(String... noSquashNids) {
        if (this.noSquashNids == null) {
            setNoSquashNids(new java.util.ArrayList<String>(noSquashNids.length));
        }
        for (String ele : noSquashNids) {
            this.noSquashNids.add(ele);
        }
        return this;
    }

    /**
     * <p>
     * When root squash is enabled, you can optionally specify an array of NIDs of clients for which root squash does
     * not apply. A client NID is a Lustre Network Identifier used to uniquely identify a client. You can specify the
     * NID as either a single address or a range of addresses:
     * </p>
     * <ul>
     * <li>
     * <p>
     * A single address is described in standard Lustre NID format by specifying the client’s IP address followed by the
     * Lustre network ID (for example, <code>10.0.1.6@tcp</code>).
     * </p>
     * </li>
     * <li>
     * <p>
     * An address range is described using a dash to separate the range (for example,
     * <code>10.0.[2-10].[1-255]@tcp</code>).
     * </p>
     * </li>
     * </ul>
     * 
     * @param noSquashNids
     *        When root squash is enabled, you can optionally specify an array of NIDs of clients for which root squash
     *        does not apply. A client NID is a Lustre Network Identifier used to uniquely identify a client. You can
     *        specify the NID as either a single address or a range of addresses:</p>
     *        <ul>
     *        <li>
     *        <p>
     *        A single address is described in standard Lustre NID format by specifying the client’s IP address followed
     *        by the Lustre network ID (for example, <code>10.0.1.6@tcp</code>).
     *        </p>
     *        </li>
     *        <li>
     *        <p>
     *        An address range is described using a dash to separate the range (for example,
     *        <code>10.0.[2-10].[1-255]@tcp</code>).
     *        </p>
     *        </li>
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public LustreRootSquashConfiguration withNoSquashNids(java.util.Collection<String> noSquashNids) {
        setNoSquashNids(noSquashNids);
        return this;
    }

    /**
     * Returns a string representation of this object. This is useful for testing and debugging. Sensitive data will be
     * redacted from this string using a placeholder value.
     *
     * @return A string representation of this object.
     *
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("{");
        if (getRootSquash() != null)
            sb.append("RootSquash: ").append(getRootSquash()).append(",");
        if (getNoSquashNids() != null)
            sb.append("NoSquashNids: ").append(getNoSquashNids());
        sb.append("}");
        return sb.toString();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;

        if (obj instanceof LustreRootSquashConfiguration == false)
            return false;
        LustreRootSquashConfiguration other = (LustreRootSquashConfiguration) obj;
        if (other.getRootSquash() == null ^ this.getRootSquash() == null)
            return false;
        if (other.getRootSquash() != null && other.getRootSquash().equals(this.getRootSquash()) == false)
            return false;
        if (other.getNoSquashNids() == null ^ this.getNoSquashNids() == null)
            return false;
        if (other.getNoSquashNids() != null && other.getNoSquashNids().equals(this.getNoSquashNids()) == false)
            return false;
        return true;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int hashCode = 1;

        hashCode = prime * hashCode + ((getRootSquash() == null) ? 0 : getRootSquash().hashCode());
        hashCode = prime * hashCode + ((getNoSquashNids() == null) ? 0 : getNoSquashNids().hashCode());
        return hashCode;
    }

    @Override
    public LustreRootSquashConfiguration clone() {
        try {
            return (LustreRootSquashConfiguration) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new IllegalStateException("Got a CloneNotSupportedException from Object.clone() " + "even though we're Cloneable!", e);
        }
    }

    @com.amazonaws.annotation.SdkInternalApi
    @Override
    public void marshall(ProtocolMarshaller protocolMarshaller) {
        com.amazonaws.services.fsx.model.transform.LustreRootSquashConfigurationMarshaller.getInstance().marshall(this, protocolMarshaller);
    }
}