// Copyright (c) 2011 DMTF.  All rights reserved.
   [Version ( "2.29.0" ), 
    UMLPackagePath ( "CIM::Device::StorageDevices" ), 
    Description ( 
       "A class derived from CIM_Service providing methods related to "
       "management of multiple paths to SCSI devices." )]
class CIM_SCSIPathConfigurationService : CIM_Service {


      [Description ( 
          "This method requests that the target change the access "
          "states of the requested SCSITargetPortGroups. This will "
          "have the effect of doing a failover or failback "
          "operation." ), 
       ValueMap { "0", "1", "2", "3", "4", "5", "..", "4096", 
          "4097", "4098", "4099", "..", "32768..65535" }, 
       Values { "Success", "Not Supported", "Unknown", "Timeout", 
          "Failed", "Invalid Parameter", "DMTF Reserved", 
          "Unsupported AccessState", "Invalid SCSITargetPortGroup", 
          "Unsupported AccessState combination", 
          "Unsupported SCSITargetPortGroup combination", 
          "Method Reserved", "Vendor Specific" }]
   uint32 SetTPGAccess(
         [IN, Description ( 
             "A reference to an instances of a subclass of "
             "CIM_LogicalDevice representing the SCSI logical "
             "unit where the command will be sent." )]
      CIM_LogicalDevice REF LogicalUnit, 
         [IN, Description ( 
             "Array of references to instances of "
             "SCSITargetPortGroup. All the referenced "
             "TargetPortGroup instances must be part of the same "
             "target device." ), 
          ArrayType ( "Indexed" ), 
          ModelCorrespondence { "CIM_SCSITargetPortGroup" }]
      CIM_SCSITargetPortGroup REF TargetPortGroups[], 
         [IN, Description ( 
             "An array of desired access states. Each access "
             "state in this array is the desired access state "
             "for the SCSITargetPortGroup in the corresponding "
             "entry in the TargetPortGroups parameter. \n"
             "\n"
             "The Active value is not part of the SCSI "
             "Specification; it is a convenience for clients "
             "that are not sure whether to specify "
             "Active/Optimized of Active/Non-optimized. The "
             "instrumentation selects a value based on historic "
             "information, knowledge of the target "
             "configuration, or trial and error. \n"
             "\n"
             "Note that SCSITargetPortGroup.AccessState includes "
             "the value \'Transitioning\' that is excluded here "
             "- a caller cannot request transitioning, though it "
             "can be reported by a target device." ), 
          ValueMap { "2", "3", "4", "5", "6" }, 
          Values { "Active/Optimized", "Active/Non-optimized", 
             "StandBy", "Unavailable", "Active" }, 
          ArrayType ( "Indexed" ), 
          ModelCorrespondence { 
             "CIM_SCSITargetPortGroup.AccessState" }]
      uint16 AccessStates[]);

      [Description ( 
          "This method requests that the target change the load "
          "balance algorithm for the referenced LogicalDevice "
          "instance." ), 
       ValueMap { "0", "1", "2", "3", "4", "5", "..", "4096", 
          "4097", "..", "32768..65535" }, 
       Values { "Success", "Not Supported", "Unknown", "Timeout", 
          "Failed", "Invalid Parameter", "DMTF Reserved", 
          "Unsupported LogicalDevice", "Invalid LoadBalanceType", 
          "Method Reserved", "Vendor Specific" }]
   uint32 SetLoadBalanceAlgorithm(
         [IN, Description ( 
             "A reference to the LogicalDevice subclass instance "
             "with an LogicalIdentity to the load balance "
             "RedundancySet. If "
             "SCSIMultipathConfigurationCapabilities. "
             "CanLoadBalanceLUsIndependently is true, just the "
             "referenced logical unit is modified. Otherwise, "
             "all logical units sharing the target are modified." )]
      CIM_LogicalDevice REF LogicalDevice, 
         [IN, Description ( "The desired load balance algorithm." ), 
          ValueMap { "0", "1", "2", "3", "4", "5", "6" }, 
          Values { "Unknown", "Other", "No Load Balancing", 
             "Round Robin", "Least Blocks", "Least IO", 
             "Product Specific" }]
      uint16 LoadBalanceAlgorithm, 
         [IN, Description ( 
             "When LoadBalanceAlgorithm is \'Other\', this "
             "parameter specifies a description of the load "
             "balancing algorithm. When LoadBalanceAlgorithm is "
             "\'Product Specific\', this property provides a "
             "string specifying the vendor/product/version of "
             "the ManagedElement." )]
      string OtherLoadBalanceAlgorithmDescription);

      [Description ( 
          "This method allows an administrator to assign a logical "
          "unit to a target port group. At any time, each LU will "
          "typically be associated with two target port groups, one "
          "in active state and one in standby state. The result of "
          "this method will be that the LU associations change to a "
          "pair of target port groups. Only valid if the target "
          "device supports asymmetric access state and "
          "SCSIMultipathConfigurationCapabilities "
          "SupportsLuAssignment is set." ), 
       ValueMap { "0", "1", "2", "3", "4", "5", "..", "32768..65535" }, 
       Values { "Success", "Not Supported", "Unknown", "Timeout", 
          "Failed", "Invalid Parameter", "DMTF Reserved", 
          "Vendor Specific" }]
   uint32 AssignLogicalUnitToPortGroup(
         [IN, Description ( 
             "A reference to an instance of a subclass of "
             "LogicalDevice representing a SCSI logical unit." )]
      CIM_LogicalDevice REF LogicalUnit, 
         [IN, Description ( 
             "A reference to a target port group. The Target "
             "Port Group should be in an active state." )]
      CIM_SCSITargetPortGroup REF TargetPortGroup);

      [Description ( 
          "This method allows an administrator to temporarily "
          "disable load balancing for a specific logical unit. The "
          "path specified as a parameter will have its "
          "AdministrativeOverride property set to \'Overriding\' "
          "and all I/O to the logical unit will be directed to this "
          "path. All other paths to this logical unit will have "
          "AdministrativeOverride set to \'Overridden\'." ), 
       ValueMap { "0", "1", "2", "3", "4", "5", "..", "32768..65535" }, 
       Values { "Success", "Not Supported", "Unknown", "Timeout", 
          "Failed", "Invalid Parameter", "DMTF Reserved", 
          "Vendor Specific" }]
   uint32 SetOverridePath(
         [IN, Description ( 
             "A reference to a SCSIInitiatorTargetLogicalUnitPath."
              )]
      CIM_SCSIInitiatorTargetLogicalUnitPath REF Path);

      [Description ( 
          "This method clears an override path as set in "
          "SetOverridePath and load balancing is enabled. All paths "
          "to the logical unit specified as a parameter will have "
          "AdministrativeOverride property set to \'No override in "
          "effect\'." ), 
       ValueMap { "0", "1", "2", "3", "4", "5", "..", "32768..65535" }, 
       Values { "Success", "Not Supported", "Unknown", "Timeout", 
          "Failed", "Invalid Parameter", "DMTF Reserved", 
          "Vendor Specific" }]
   uint32 CancelOverridePath(
         [IN, Description ( 
             "A reference to a SCSIInitiatorTargetLogicalUnitPath."
              )]
      CIM_LogicalDevice REF LogicalUnit);

};
