module ciena-waveserver-chassis {
  namespace "urn:ciena:params:xml:ns:yang:ciena-ws:ciena-waveserver-chassis";
  prefix chassis;

  import ciena-waveserver-typedefs {
    prefix cienawstypes;
  }

  organization
    "Ciena Corporation";
  contact
    "Web URL: http://www.ciena.com/
     Postal:  7035 Ridge Road
             Hanover, Maryland 21076
             U.S.A.
     Phone:   +1 800-921-1144
     Fax:     +1 410-694-5750";
  description
    "This module defines Chassis data for the Waveserver Platform.";

  revision 2017-12-20 {
    description
      "Added management-port 'mode', 'speed', and 'duplex' for wayside channel configuration.
       Added return code for waveserver-wcs-restart and waveserver-wcs-restart-cold.";
    reference "Waveserver Ai user's guide.";
  }
  revision 2017-09-05 {
    description
      "Waveserver Platform Data Model
       Migrated from Waveserver Classic R1.4 YANG model.
       Updated namespace to 'ciena-waveserver'.
       Added 'waveserver ai chassis' type.
       Updated several UI and description strings.
       Added access-panel container, wcs container, and inventory view of components.
       Added slot power management and wcs-restart RPCs.
       Removed 10-second delay from restart RPCs and remove restart-cancel RPCs.
       Added access-panel capabilities.
       Moved several device-id attributes into common grouping used by all components.
       Removed 'number-of-fans', 'number-of-temperature-sensors' and 'status' list from 'cooling-fan-units/properties' container.";
    reference "Waveserver Ai user's guide.";
  }

  typedef mac-block-size {
    type uint32;
    description
      "MAC address block size.";
  }

  typedef chassis-operation-state {
    type enumeration {
      enum "uninstalled" {
        description
          "Device is not present.";
      }
      enum "normal" {
        description
          "Device is up/operational.";
      }
      enum "faulted" {
        description
          "Device is in a failed/faulted state.";
      }
    }
    description
      "Chassis operational state. Applies to PSU, CFU, AP, WCS components in the chassis.";
  }

  grouping device-id-group {
    description
      "Common group of device identification attributes for components in the chassis.";
    leaf model {
      type cienawstypes:string-maxl-50;
      config false;
      description
        "Device model information.";
    }
    leaf description {
      type cienawstypes:string-maxl-254;
      config false;
      description
        "Device description.";
    }
    leaf serial-number {
      type cienawstypes:string-maxl-50;
      config false;
      description
        "Device serial number information.";
    }
    leaf part-number {
      type cienawstypes:string-maxl-50;
      config false;
      description
        "Device part number information.";
    }
    leaf revision {
      type cienawstypes:string-maxl-50;
      config false;
      description
        "Device revision information.";
    }
    leaf manufacture-date {
      type cienawstypes:string-maxl-50;
      config false;
      description
        "Device Manufacture Date, in string format.";
    }
  }

  container waveserver-chassis {
    description
      "Waveserver chassis configuration data and operational data.";
    container identification {
      config false;
      description
        "Waveserver chassis identification attributes.";
      leaf type {
        type enumeration {
          enum "unknown chassis" {
            description
              "Chassis type is unknown.";
          }
          enum "waveserver chassis" {
            description
              "Waveserver WL3e Chassis.";
          }
          enum "waveserver ai chassis" {
            description
              "Waveserver Ai Chassis.";
          }
        }
        config false;
        description
          "Type enum value of the Chassis.";
      }
      uses device-id-group;
    }
    container capabilities {
      config false;
      description
        "Waveserver chassis capabilities attributes.";
      container control {
        description
          "Control module capabilities for this chassis.";
        leaf count {
          type uint8;
          config false;
          description
            "Number of control modules available to the Waveserver chassis.";
        }
        leaf type {
          type cienawstypes:module-type-bits;
          config false;
          description
            "Chassis control module type. Can be integrated or field-replaceable.";
        }
      }
      container access-panel {
        description
          "Access Panel capabilities for this chassis.";
        leaf count {
          type uint8;
          config false;
          description
            "Number of access panel modules available to the Waveserver chassis.";
        }
        leaf type {
          type cienawstypes:module-type-bits;
          config false;
          description
            "Chassis access panel module type. Can be integrated or field-replaceable.";
        }
      }
      container switch {
        description
          "Switch module capabilities for this chassis.";
        leaf count {
          type uint8;
          config false;
          description
            "Number of switch modules available to the Waveserver chassis.";
        }
        leaf type {
          type cienawstypes:module-type-bits;
          config false;
          description
            "Chassis switch module type. Can be integrated or field-replaceable.";
        }
      }
      container modules {
        description
          "Service module capabilities for this chassis.";
        leaf count {
          type uint8;
          config false;
          description
            "Total number of service modules available to a fully-equipped Waveserver chassis.";
        }
        leaf type {
          type cienawstypes:module-type-bits;
          config false;
          description
            "Chassis service module type. Can be integrated or field-replaceable.";
        }
      }
      container fan {
        description
          "Fan unit capabilities for this chassis.";
        leaf count {
          type uint8;
          config false;
          description
            "Number of fan units available to the Waveserver chassis.";
        }
        leaf type {
          type cienawstypes:module-type-bits;
          config false;
          description
            "Chassis fan unit type. Can be integrated or field-replaceable.";
        }
      }
      container air-filter {
        description
          "Air filter capabilities for this chassis.";
        leaf supported {
          type cienawstypes:yes-no-enum;
          config false;
          description
            "Is the air filter supported on the Waveserver chassis.";
        }
        leaf type {
          type cienawstypes:module-type-bits;
          config false;
          description
            "Chassis air filter type. Can be integrated or field-replaceable.";
        }
        leaf active {
          type cienawstypes:yes-no-enum;
          config false;
          description
            "Is the air filter active on the Waveserver chassis.";
        }
      }
      container power {
        description
          "Power supply capabilities for this chassis.";
        leaf count {
          type uint8;
          config false;
          description
            "Number of power supply units available to the Waveserver chassis.";
        }
        leaf type {
          type cienawstypes:module-type-bits;
          config false;
          description
            "Power supply unit type. Can be integrated or field-replaceable.";
        }
        leaf redundant {
          type cienawstypes:yes-no-enum;
          config false;
          description
            "Is redundant power present for the Waveserver chassis.";
        }
        leaf dc-support {
          type cienawstypes:yes-no-enum;
          config false;
          description
            "Whether or not DC power is supported.";
        }
      }
    }
    container mac-addresses {
      config false;
      description
        "MAC Addresses used by this chassis.";
      container chassis {
        description
          "Chassis MAC address information.";
        leaf base {
          type cienawstypes:mac-string;
          config false;
          description
            "The Chassis Base MAC address. All MACs used in shelf offset from this.";
        }
        leaf block-size {
          type mac-block-size;
          config false;
          description
            "Number of MACs allocated by manufacturing.";
        }
      }
      container local-management {
        description
          "Local management MAC address information.";
        leaf base {
          type cienawstypes:mac-string;
          config false;
          description
            "Local Management MAC address.";
        }
        leaf block-size {
          type mac-block-size;
          config false;
          description
            "Local Management MAC Block Size.";
        }
      }
      container remote-management {
        description
          "Remote management MAC address information.";
        leaf base {
          type cienawstypes:mac-string;
          config false;
          description
            "Remote Management MAC address.";
        }
        leaf block-size {
          type mac-block-size;
          config false;
          description
            "Remote Management MAC address Block Size.";
        }
      }
      container dcn {
        description
          "Data Communications Network (DCN) port MAC address information.";
        leaf base {
          type cienawstypes:mac-string;
          config false;
          description
            "DCN MAC address.";
        }
        leaf block-size {
          type mac-block-size;
          config false;
          description
            "DCN MAC address Block Size.";
        }
      }
      container ilan-1 {
        description
          "Internal Local Area Network 1 (ILAN-1) port MAC address information.";
        leaf base {
          type cienawstypes:mac-string;
          config false;
          description
            "ILAN-1 MAC address.";
        }
        leaf block-size {
          type mac-block-size;
          config false;
          description
            "ILAN-1 MAC address Block Size.";
        }
      }
      container ilan-2 {
        description
          "Internal Local Area Network 2 (ILAN-2) port MAC address information.";
        leaf base {
          type cienawstypes:mac-string;
          config false;
          description
            "ILAN-2 MAC address.";
        }
        leaf block-size {
          type mac-block-size;
          config false;
          description
            "ILAN-2 MAC address Block Size.";
        }
      }
      container ports {
        description
          "Port MAC address information.";
        leaf base {
          type cienawstypes:mac-string;
          config false;
          description
            "Port Base MAC address.";
        }
        leaf block-size {
          type mac-block-size;
          config false;
          description
            "Port Base MAC address Block Size.";
        }
      }
      container reserved {
        description
          "Reserved MAC address information.";
        leaf base {
          type cienawstypes:mac-string;
          config false;
          description
            "Reserved MAC address.";
        }
        leaf block-size {
          type mac-block-size;
          config false;
          description
            "Reserved MAC address Block Size.";
        }
      }
    }
    list power-supply-units {
      key "psu-number";
      description
        "Power Supply Unit Status.";
      leaf psu-number {
        type uint8;
        description
          "Unique index number for the Power Supply Unit list entry.";
      }
      leaf name {
        type cienawstypes:string-maxl-16;
        config false;
        description
          "Name of the power supply unit. In the format of PSU-<slot #>. Contains the slot number of the power supply unit.";
      }
      container state {
        description
          "Power Supply Unit state information.";
        leaf admin-state {
          type cienawstypes:enabled-disabled-enum;
          description
            "Whether admin state of the Power Supply Unit is enabled or disabled. Disabled state masks the alarms only.";
        }
        leaf operational-state {
          type chassis-operation-state;
          config false;
          description
            "Operational state of the Power Supply Unit.";
        }
      }
      container properties {
        config false;
        description
          "All the operational data fields of this Power Supply Unit.";
        leaf type {
          type enumeration {
            enum "AC" {
              description
                "Power supply unit uses AC power.";
            }
            enum "DC" {
              description
                "Power supply unit uses DC power.";
            }
            enum "unequipped" {
              description
                "Power supply unit is unequipped.";
            }
          }
          config false;
          description
            "The Power Supply Unit type.";
        }
      }
      container device-id {
        config false;
        description
          "Device identification information of this Power Supply Unit.";
        uses device-id-group;
      }
    }
    list cooling-fan-units {
      key "cfu-number";
      description
        "Cooling Fan Unit Status.";
      leaf cfu-number {
        type uint8;
        description
          "Unique index number for the Cooling Fan Unit list entry.";
      }
      leaf name {
        type cienawstypes:string-maxl-16;
        config false;
        description
          "Name of the cooling fan unit. In the format of CFU-<slot #>. Contains the slot number of the cooling fan unit.";
      }
      container state {
        description
          "Cooling Fan Unit state information.";
        leaf admin-state {
          type cienawstypes:enabled-disabled-enum;
          description
            "Whether Admin State of the cooling fan unit is enabled or disabled. Disabled state masks the alarms only.";
        }
        leaf operational-state {
          type chassis-operation-state;
          config false;
          description
            "Operational state of the Cooling Fan unit.";
        }
      }
      container properties {
        config false;
        description
          "All the operational data fields of this Cooling Fan Unit.";
        leaf automatic-control {
          type cienawstypes:enabled-disabled-enum;
          config false;
          description
            "Whether Automatic Control of the cooling fan unit is enabled or disabled.";
        }
      }
      container device-id {
        config false;
        description
          "Device Identification information of this Cooling Fan Unit.";
        uses device-id-group;
      }
    }
    list management-port {
      key "index";
      description
        "A list to manage chassis ports.";
      leaf index {
        type uint16;
        description
          "Index value of the management port.";
      }
      container id {
        config false;
        description
          "Identification information of this management port.";
        leaf name {
          type cienawstypes:string-maxl-16;
          config false;
          description
            "Name of the Port. The names are predefined.";
        }
      }
      container state {
        description
          "Management port state information.";
        leaf admin-state {
          type cienawstypes:enabled-disabled-enum;
          description
            "Whether Admin State is enabled or disabled for this management port.";
        }
        leaf operational-state {
          type cienawstypes:up-down-enum;
          config false;
          description
            "Operational state of this management port.";
        }
      }
      container properties {
        description
          "All the operational data of this management port.";
        leaf type {
          type enumeration {
            enum "ethernet" {
              description
                "Ethernet management port.";
            }
            enum "serial" {
              description
                "Serial management port.";
            }
          }
          config false;
          description
            "Management port type. If the port is DCN, ilan-1, or ilan-2, the port type will be Ethernet. If the port is Console, the port type will be Serial.";
        }
        leaf mode {
          type enumeration {
            enum "management" {
              description
                "Management port is configured as a local management interface. This is the default mode.";
            }
            enum "wayside-channel" {
              description
                "Management port is configured as a wayside communications channel.";
            }
          }
          description
            "Management port mode. Specifies whether the port is configured as a local management interface or wayside communications channel (carry through).";
        }
        leaf speed {
          type enumeration {
            enum "Unknown" {
              description
                "Unknown port speed.";
            }
            enum "10M" {
              description
                "10 Mbps Ethernet.";
            }
            enum "100M" {
              description
                "100 Mbps Ethernet.";
            }
            enum "1G" {
              description
                "1 Gbps Ethernet.";
            }
            enum "10G" {
              description
                "10 Gbps Ethernet.";
            }
          }
          config false;
          description
            "Management port speed.";
        }
        leaf duplex {
          type enumeration {
            enum "Unknown" {
              description
                "Unknown port duplex.";
            }
            enum "full" {
              description
                "Port is full-duplex.";
            }
            enum "half" {
              description
                "Port is half-duplex.";
            }
          }
          config false;
          description
            "Management port duplex.";
        }
        leaf mac-address {
          type cienawstypes:mac-string;
          config false;
          description
            "MAC Address of the management port.";
        }
        leaf max-frame-size {
          type uint32;
          config false;
          description
            "Max Frame Size of the management port.";
        }
      }
    }
    container access-panel {
      description
        "Access Panel";
      container state {
        description
          "Access Panel state information.";
        leaf admin-state {
          type cienawstypes:enabled-disabled-enum;
          description
            "Whether admin state of the Access Panel is enabled or disabled.";
        }
        leaf operational-state {
          type chassis-operation-state;
          config false;
          description
            "Operational state of the Access Panel.";
        }
      }
      container properties {
        config false;
        description
          "All the operational data fields of the Access Panel.";
        leaf type {
          type enumeration {
            enum "type-1" {
              description
                "Access Panel Type 1.";
            }
            enum "unequipped" {
              description
                "Access Panel is unequipped.";
            }
          }
          config false;
          description
            "The Access Panel type.";
        }
      }
      container device-id {
        config false;
        description
          "Device identification information of the Access Panel.";
        uses device-id-group;
      }
    }
    container wcs {
      description
        "Waveserver Control Subsystem. This is the control module for the Waveserver Ai chassis.";
      container state {
        description
          "WCS control module state information.";
        leaf admin-state {
          type cienawstypes:enabled-disabled-enum;
          description
            "Whether admin state of the WCS is enabled or disabled.";
        }
        leaf operational-state {
          type chassis-operation-state;
          config false;
          description
            "Operational state of the WCS.";
        }
      }
      container properties {
        config false;
        description
          "All the operational data fields of the WCS.";
        leaf type {
          type enumeration {
            enum "type-1" {
              description
                "WCS Type 1.";
            }
            enum "unequipped" {
              description
                "WCS is unequipped.";
            }
          }
          config false;
          description
            "The WCS module type.";
        }
      }
      container device-id {
        config false;
        description
          "Device identification information of the WCS.";
        uses device-id-group;
      }
    }
    container inventory {
      config false;
      description
        "The inventory view of all of the components in the chassis.";
      list component {
        key "index";
        config false;
        description
          "Inventory component details.";
        leaf index {
          type uint16;
          description
            "Index value of the inventory component.";
        }
        leaf name {
          type cienawstypes:string-maxl-16;
          config false;
          description
            "Name of the inventory component (e.g., Chassis, DCN, WCS, AP, PSU-<n>, CFU-<n>, etc.).";
        }
        uses device-id-group;
      }
    }
    list slot {
      key "slot-id";
      description
        "Chassis slot power management.";
      leaf slot-id {
        type uint8 {
          range "1..3";
        }
        mandatory true;
        description
          "Chassis slot number, Key value for the chassis slot list.";
      }
      leaf power-state {
        type cienawstypes:power-state;
        config false;
        description
          "Slot power state.";
      }
      leaf actual-power-state {
        type cienawstypes:on-off-enum;
        config false;
        description
          "The actual power state (on or off) of the specified slot.";
      }
    }
  }
  rpc waveserver-chassis-restart {
    description
      "Initiates a chassis warm restart. This restarts the WCS and all modules.";
  }
  rpc waveserver-chassis-restart-cold {
    description
      "Initiates a chassis cold restart. This restarts the WCS and all modules.";
  }
  rpc waveserver-wcs-restart {
    description
      "Initiates a WCS warm restart.";
    output {
      leaf return-code {
        type uint32;
        description
          "return code: 0 is success; non-zero is failure";
      }
      leaf return-string {
        type cienawstypes:string-maxl-254;
        description
          "Return code description";
      }
    }
  }
  rpc waveserver-wcs-restart-cold {
    description
      "Initiates a WCS cold restart.";
    output {
      leaf return-code {
        type uint32;
        description
          "return code: 0 is success; non-zero is failure";
      }
      leaf return-string {
        type cienawstypes:string-maxl-254;
        description
          "Return code description";
      }
    }
  }
}
