// Copyright (c) 2008 DMTF.  All rights reserved.
   [Version ( "2.18.0" ), 
    UMLPackagePath ( "CIM::Core::Redundancy" ), 
    Description ( 
       "A class derived from SystemSpecificCollection that is a "
       "special collection of ManagedElements. This collection "
       "indicates that the aggregated elements together provide "
       "redundancy, or that redundancy is provided via sparing. All "
       "elements collected in a RedundancySet SHOULD be instantiations "
       "of the same object class." )]
class CIM_RedundancySet : CIM_SystemSpecificCollection {

      [Description ( 
          "RedundancyStatus provides information on the state of "
          "the RedundancyGroup. \'Fully Redundant\' (value=2) means "
          "that all of the configured redundancy is still "
          "available; \'Degraded Redundancy\' (3) means that some "
          "configured elements are degraded, missing or failed but "
          "that the number of elements in the set is still greater "
          "than the minimum required (\'MinNumberNeeded\'); "
          "\'Redundancy Lost\' (4) means that sufficient configured "
          "elements are missing or failed that no redundancy is "
          "available and the next failure experienced will cause "
          "overall failure. \'Overall Failure\' (5) means that "
          "there has been an overall failure of the RedundancySet." ), 
       ValueMap { "0", "1", "2", "3", "4", "5" }, 
       Values { "Unknown", "DMTF Reserved", "Fully Redundant", 
          "Degraded Redundancy", "Redundancy Lost", "Overall Failure" }, 
       ModelCorrespondence { "CIM_RedundancySet.MinNumberNeeded" }]
   uint16 RedundancyStatus;

      [Description ( 
          "TypeOfSet provides information on the type of "
          "redundancy. N+1 (=2) indicates all members are active, "
          "are unaware and function independent of one another. "
          "However, there exist at least one extra member to "
          "achieve functionality. \'Sparing\' is implied (i.e. each "
          "member can be a spare for the other(s). An example of "
          "N+1 is a system that has 2 power supplies, but needs "
          "only 1 power supply to functioning properly. N+1 is a "
          "special case of N+M redundancy where M=1. A value of N+1 "
          "(=2) shall be used for N+M redundancy. - Load Balanced "
          "(=3) indicates all members are active. However, there "
          "functionality is not independent of each other. Their "
          "functioning is determined by some sort of load balancing "
          "algrothim (implemented in hardware and/or software). "
          "\'Sparing\' is implied (i.e. each member can be a spare "
          "for the other(s). \n"
          "- Sparing (=4) indicates that all members are active and "
          "are aware of each others. However, their functionality "
          "is independent until failover. Each member can be a "
          "spare for the other(s). \n"
          "- Limited Sparing (=5) indicates that all members are "
          "active, and they may or may not be aware of each and "
          "they are not spares for each other. Instead, their "
          "redundancy is indicated by the IsSpare relationship." ), 
       ValueMap { "0", "1", "2", "3", "4", "5", "..", "0x8000.." }, 
       Values { "Unknown", "Other", "N+1", "Load Balanced", 
          "Sparing", "Limited Sparing", "DMTF Reserved", 
          "Vendor Reserved" }, 
       ArrayType ( "Indexed" ), 
       ModelCorrespondence { "CIM_RedundancySet.OtherTypeOfSet" }]
   uint16 TypeOfSet[];

      [Description ( 
          "MinNumberNeeded indicates the smallest number of "
          "elements that MUST be operational in order to function. "
          "For example, in an N+1 redundancy relationship, the "
          "MinNumberNeeded property is set equal to N. In a "
          "\'LimitedSparing\' environment, this property is "
          "meaningless and SHOULD be set to zero." ), 
       MinValue ( 0 )]
   uint32 MinNumberNeeded;

      [Description ( 
          "MaxNumberSupported indicates the largest number of "
          "elements that can participate in the RedundancySet. A "
          "value of 0 indicates there is no limit on the number of "
          "elements." )]
   uint32 MaxNumberSupported;

      [Description ( 
          "VendorIdentifyingInfo captures the vendor identifying "
          "data for the RedundancySet. One example is the product "
          "name for a cluster." )]
   string VendorIdentifyingInfo;

      [Description ( 
          "When the corresponding array entry in TypeOfSet[] is "
          "\'Other\', this entry provides a string describing the "
          "type of set." ), 
       ArrayType ( "Indexed" ), 
       ModelCorrespondence { "CIM_RedundancySet.TypeOfSet" }]
   string OtherTypeOfSet[];

      [Write, Description ( 
          "The current load balance algorithm. \n"
          "Least Blocks, Least IO, and Address Region are used in "
          "storage device path redundancy drivers to optimize load "
          "balancing by routing requests to a path with the least "
          "queued blocks or IO requests, or based on locality of "
          "reference. \n"
          "\'Product Specific\' indicates that the algorithm is "
          "optimized for a particular type of product. Information "
          "about that product SHOULD be provided in an associated "
          "CIM_Product instance." ), 
       ValueMap { "0", "1", "2", "3", "4", "5", "6", "7" }, 
       Values { "Unknown", "Other", "No Load Balancing", 
          "Round Robin", "Least Blocks", "Least IO", 
          "Address Region", "Product Specific" }, 
       ModelCorrespondence { 
          "CIM_RedundancySet.OtherLoadBalanceAlgorithm" }]
   uint16 LoadBalanceAlgorithm = 2;

      [Write, Description ( 
          "When LoadBalanceAlgorithm is Other, this property "
          "describes the algorithm." ), 
       ModelCorrespondence { "CIM_RedundancySet.LoadBalanceAlgorithm" }]
   string OtherLoadBalanceAlgorithm;


      [Description ( 
          "This method forces a failover from one ManagedElement to "
          "another. There are two parameters to the Failover "
          "method. \n"
          "- FailoverFrom is a reference to an \'active\' "
          "ManagedElement that will become inactive after the "
          "method. This element SHOULD be part of the RedundancySet "
          "via a MemberOfCollection relationship. \n"
          "- FailoverTo is a reference to the ManagedElement that "
          "will take over for the FailoverFrom element. This "
          "element SHOULD either be a member of the RedundancySet "
          "or be associated with the RedundancySet via an IsSpare "
          "relationship. \n"
          "\n"
          "Upon sucessful completion: \n"
          "- the FailoverTo element SHOULD be associated to the "
          "RedundancySet via MemberOfCollection. \n"
          "- the FailFrom element SHOULD either still be associated "
          "to the RedundandySet via MemberOfCollection with a "
          "OperationalStatus or EnableState that indicates it not "
          "active, or it SHOULD be associated to the \'Spared\' "
          "collection via the MemberOfCollection association." ), 
       ValueMap { "0", "1", "2", "3", "4", "..", "32768..65535" }, 
       Values { "Completed with No Error", "Not Supported", 
          "Unknown/Unspecified Error", "Busy/In Use", 
          "Paramter Error", "DMTF Reserved", "Vendor Reserved" }]
   uint32 Failover(
         [IN, Description ( 
             "The primary ManagedSystemElement that will become "
             "inactive after the method." )]
      CIM_ManagedElement REF FailoverFrom, 
         [IN, Description ( 
             "The ManagedSystemElement that will take over from "
             "the primary MSE." )]
      CIM_ManagedElement REF FailoverTo);

};
