// Copyright (c) 2005 DMTF.  All rights reserved.
   [Version ( "2.11.0" ), 
    UMLPackagePath ( "CIM::Device::StorageServices" ), 
    Description ( 
       "A subclass of Capabilities that defines the Capabilities of a "
       "StorageService or StoragePool. For example, an instance of "
       "StorageCapabilities could be associated with either a "
       "StorageConfigurationService or StoragePool by using "
       "ElementCapabilities." )]
class CIM_StorageCapabilities : CIM_Capabilities {

      [Description ( 
          "Enumeration indicating the type of element to which this "
          "StorageCapabilities applies." ), 
       ValueMap { "0", "1", "2", "3", "4", "5", "6", "7" }, 
       Values { "Unknown", "Reserved", "Any Type", "StorageVolume", 
          "StorageExtent", "StoragePool", 
          "StorageConfigurationService", "LogicalDisk" }]
   uint16 ElementType;

      [Description ( 
          "Indicates whether or not the associated element supports "
          "no single point of failure. Values are: FALSE = does not "
          "support no single point of failure, and TRUE = supports "
          "no single point of failure." ), 
       ModelCorrespondence { 
          "CIM_StorageCapabilities.NoSinglePointOfFailureDefault" }]
   boolean NoSinglePointOfFailure;

      [Description ( 
          "Indicates the default value for the "
          "NoSinglePointOfFailure property." ), 
       ModelCorrespondence { 
          "CIM_StorageCapabilities.NoSinglePointOfFailure" }]
   boolean NoSinglePointOfFailureDefault;

      [Description ( 
          "DataRedundancyMax describes the maximum number of "
          "complete copies of data that can be maintained. Examples "
          "would be RAID 5 (where 1 copy is maintained) and RAID 1 "
          "(where 2 or more copies are maintained). Possible values "
          "are 1 to n. The default redundancy is specified using "
          "DataRedundancyDefault, while the minimum is defined by "
          "DataRedundancyMin." ), 
       MinValue ( 1 ), 
       ModelCorrespondence { 
          "CIM_StorageCapabilities.DataRedundancyMin", 
          "CIM_StorageCapabilities.DataRedundancyDefault" }]
   uint16 DataRedundancyMax;

      [Description ( 
          "DataRedundancyMin describes the minimum number of "
          "complete copies of data that can be maintained. Examples "
          "would be RAID 5 where 1 copy is maintained and RAID 1 "
          "where 2 or more copies are maintained). Possible values "
          "are 1 to n. The default redundancy is specified using "
          "DataRedundancyDefault, while the maximum is defined by "
          "DataRedundancyMax." ), 
       MinValue ( 1 ), 
       ModelCorrespondence { 
          "CIM_StorageCapabilities.DataRedundancyMax", 
          "CIM_StorageCapabilities.DataRedundancyDefault" }]
   uint16 DataRedundancyMin;

      [Description ( 
          "DataRedundancyDefault describes the default number of "
          "complete copies of data that can be maintained. Examples "
          "would be RAID 5 where 1 copy is maintained and RAID 1 "
          "where 2 or more copies are maintained. Possible values "
          "are 1 to n. The bounds for the redundancy (max and min) "
          "are defined by DataRedundancyMax and DataRedundancyMin." ), 
       MinValue ( 1 ), 
       ModelCorrespondence { 
          "CIM_StorageCapabilities.DataRedundancyMax", 
          "CIM_StorageCapabilities.DataRedundancyMin" }]
   uint16 DataRedundancyDefault;

      [Description ( 
          "PackageRedundancyMax describes the maximum number of "
          "redundant packages that can be used. For example, in the "
          "storage domain, package redundancy describes how many "
          "disk spindles can fail without data loss including, at "
          "most, one spare. An example would be RAID5 with a spare "
          "disk which would have a PackageRedundancy of 2. Possible "
          "values are 0 to n. The default redundancy is specified "
          "using PackageRedundancyDefault, while the maximum is "
          "defined by PackageRedundancyMax." ), 
       ModelCorrespondence { 
          "CIM_StorageCapabilities.PackageRedundancyMin", 
          "CIM_StorageCapabilities.PackageRedundancyDefault" }]
   uint16 PackageRedundancyMax;

      [Description ( 
          "PackageRedundancyMin describes the minimum number of "
          "redundant packages that can be used. For example, in the "
          "storage domain, package redundancy describes how many "
          "disk spindles can fail without data loss including, at "
          "most, one spare. An example would be RAID5 with a spare "
          "disk which would have a PackageRedundancy of 2. Possible "
          "values are 0 to n. The default redundancy is specified "
          "using PackageRedundancyDefault, while the minimum is "
          "defined by PackageRedundancyMin." ), 
       ModelCorrespondence { 
          "CIM_StorageCapabilities.PackageRedundancyMax", 
          "CIM_StorageCapabilities.PackageRedundancyDefault" }]
   uint16 PackageRedundancyMin;

      [Description ( 
          "PackageRedundancyDefault describes the default number of "
          "redundant packages that will be used. For example, in "
          "the storage domain, package redundancy describes how "
          "many disk spindles can fail without data loss including, "
          "at most, one spare. An example would be RAID5 with a "
          "spare disk which would have a PackageRedundancy of 2. "
          "Possible values are 0 to n. The bounds for redundancy "
          "are specified using the properties, PackageRedundancyMax "
          "and PackageRedundancyMin." ), 
       ModelCorrespondence { 
          "CIM_StorageCapabilities.PackageRedundancyMin", 
          "CIM_StorageCapabilities.PackageRedundancyMax" }]
   uint16 PackageRedundancyDefault;

      [Description ( 
          "DeltaReservatioMax is a number between 1 (1%) and a 100 "
          "(100%) that specifies the maximum amount of space "
          "reserved in a replica for caching changes. For a "
          "complete copy this would be 100%, but it can be lower in "
          "some implementations. This parameter sets the upper "
          "limit, while DeltaReservationMin sets the lower limit." ), 
       Units ( "Percentage" ), 
       MinValue ( 0 ), 
       MaxValue ( 100 ), 
       ModelCorrespondence { 
          "CIM_StorageCapabilities.DeltaReservationMin", 
          "CIM_StorageCapabilities.DeltaReservationDefault" }]
   uint16 DeltaReservationMax;

      [Description ( 
          "DeltaReservationMin is a number between 1 (1%) and a 100 "
          "(100%) that specifies the minimum amount of space that "
          "should be reserved in a replica for caching changes. For "
          "a complete copy this would be 100%, but it can be lower "
          "in some implementations. This parameter sets the lower "
          "limit, while DeltaReservationMax sets the upper limit." ), 
       Units ( "Percentage" ), 
       MinValue ( 0 ), 
       MaxValue ( 100 ), 
       ModelCorrespondence { 
          "CIM_StorageCapabilities.DeltaReservationMax", 
          "CIM_StorageCapabilities.DeltaReservationDefault" }]
   uint16 DeltaReservationMin;

      [Description ( 
          "Delta reservation is a number between 1 (1%) and a 100 "
          "(100%) that specifies how much space should be reserved "
          "by default in a replica for caching changes. For a "
          "complete copy this would be 100%, but it can be lower in "
          "some implementations. This parameter sets the default "
          "value, while DeletaReservationMax and DeltReservationMin "
          "set the upper and lower bounds." ), 
       Units ( "Percentage" ), 
       MinValue ( 0 ), 
       MaxValue ( 100 ), 
       ModelCorrespondence { 
          "CIM_StorageCapabilities.DeltaReservationMax", 
          "CIM_StorageCapabilities.DeltaReservationMin" }]
   uint16 DeltaReservationDefault;

      [Description ( 
          "Extent Stripe Length describes the number of underlying "
          "StorageExtents across which data is striped in the "
          "common striping-based storage organizations. This is "
          "also known as the number of \'members\' or \'columns\'. \n"
          "A NULL value for ExtentStripeLengthDefault indicates "
          "that the system does not support configuration of "
          "storage by specifying Stripe Length. \n"
          "If Extent Stripe Length is supported, and this "
          "Capabilities instance is associated with a pool that was "
          "created with a range of QOS then "
          "ExtentStripeLengthDefault represents the default value. "
          "Other available values(such as min, max, and discrete "
          "values) can be determined by using the "
          "\'GetSupportedStripeLengths\' and "
          "\'GetSupportedStripeLengthRange\' methods. \n"
          "If Extent Stripe Length is supported and the pool was "
          "created with a single specific QOS, representing a Raid "
          "group, set, or rank, then this property represents the "
          "current/fixed value for the pool, and Extent Stripe "
          "Length is not supported in subsequent creation of "
          "elements from this pool. Consequently, the "
          "\'GetSupportedStripeLength\' methods cannot be used, and "
          "in a StorageSetting instance used as a goal when "
          "creating or modifying a child element of the pool, "
          "ExtentStripeLengthGoal, ExtentStripeLengthMin, and "
          "ExtentStripeLengthMax MUST be set to NULL." ), 
       MinValue ( 1 )]
   uint16 ExtentStripeLengthDefault;

      [Description ( 
          "ParityLayout specifies whether a parity-based storage "
          "organization is using rotated or non-rotated parity. If "
          "this capabilities instance is associated with a pool "
          "that was created with a range of QOS then "
          "ParityLayoutDefault represents the default value. Other "
          "available values can be determined by using the "
          "\'GetSupportedParityLayouts\' method. If the pool was "
          "created with a single specific QOS, representing a Raid "
          "group, set, or rank, then this property represents the "
          "current/fixed value for the pool, and ParityLayout is "
          "not supported in subsequent creation of elements from "
          "this pool. Consequently, the \'GetSupportedParityLayouts\' "
          "method cannot be used, and the ParityLayoutGoal property "
          "in StorageSetting instances used in child element "
          "operations on this pool MUST be set to NULL. A NULL "
          "value for ParityLayoutDefault indicates that the system "
          "does not support configuration of storage by specifying "
          "ParityLayout." ), 
       ValueMap { "2", "3" }, 
       Values { "Non-Rotated Parity", "Rotated Parity" }]
   uint16 ParityLayoutDefault;

      [Description ( 
          "User Data Stripe Depth describes the number of bytes "
          "forming a strip in common striping-based storage "
          "organizations. The strip is defined as the size of the "
          "portion of a stripe that lies on one extent. Thus, "
          "ExtentStripeLength * UserDataStripeDepth will yield the "
          "size of one stripe of user data. A NULL value for "
          "UserDataStripeDepthDefault indicates that the system "
          "does not support configuration of storage by specifying "
          "Stripe Depth. \n"
          "If User Data Stripe Depth is supported, and this "
          "Capabilities instance is associated with a pool that was "
          "created with a range of QOS then "
          "UserDataStripeDepthDefault represents the default value. "
          "Other available values(such as min, max, and discrete "
          "values) can be determined by using the "
          "\'GetSupportedStripeDepths\' and "
          "\'GetSupportedStripeDepthRange\' methods. \n"
          "If User Data Stripe Depth is supported and the pool was "
          "created with a single specific QOS, representing a Raid "
          "group, set, or rank, then this property represents the "
          "current/fixed value for the pool, and User Data Stripe "
          "Depth is not supported in subsequent creation of "
          "elements from this pool. Consequently, the "
          "\'GetSupportedStripeDepth\' methods cannot be used, and "
          "in a StorageSetting instance used as a goal when "
          "creating or modifying a child element of the pool, "
          "UserDataStripeDepthGoal, UserDataStripeDepthMin, and "
          "UserDataStripeDepthMax MUST be set to NULL." ), 
       Units ( "Bytes" ), 
       MinValue ( 1 )]
   uint64 UserDataStripeDepthDefault;


      [Description ( 
          "Method to create and populate a StorageSetting instance "
          "from a StorageCapability instance. This removes the need "
          "to populate default settings and other settings in the "
          "context of each StorageCapabilities (which could be "
          "numerous). If the underlying instrumentation supports "
          "the StorageSettingWithHints subclass, then an instance "
          "of that class will be created instead." ), 
       ValueMap { "0", "1", "2", "3", "4", "5", "..", "32768..65535" }, 
       Values { "Success", "Not Supported", "Unspecified Error", 
          "Timeout", "Failed", "Invalid Parameter", "DMTF Reserved", 
          "Vendor Specific" }]
   uint32 CreateSetting(
         [IN, Description ( 
             "If \'Default\' is passed for the CreateDefault "
             "parameter, the Max, Goal, and Min setting "
             "attributes are set to the Default values of the "
             "parent StorageCapabilities when the instance is "
             "created. \n"
             "If set to \'Goal\' the new StorageSetting "
             "attributes are set to the related attributes of "
             "the parent StorageCapabilities, e.g. Min to Min, "
             "Goal to Default, and Max to Max. \n"
             "\n"
             "This method maybe deprecated in lieu of intrinsics "
             "once limitations in the CIM Operations are "
             "addressed." ), 
          ValueMap { "2", "3" }, 
          Values { "Default", "Goal" }]
      uint16 SettingType, 
         [IN ( false ), OUT, Description ( 
             "Reference to the created StorageSetting instance." )]
      CIM_StorageSetting REF NewSetting);

      [Description ( 
          "For systems that support Parity-based storage "
          "organizations for volume or pool creation, this method "
          "can be used to the supported parity layouts." ), 
       ValueMap { "0", "1", "2" }, 
       Values { "Method completed OK", "Method not supported", 
          "Choice not aavailable for this capability" }]
   uint32 GetSupportedParityLayouts(
         [IN ( false ), OUT, Description ( 
             "List of supported Parity for a Volume/Pool "
             "creation or modification." ), 
          ValueMap { "2", "3" }, 
          Values { "Non-Rotated Parity", "Rotated Parity" }, 
          ArrayType ( "Indexed" )]
      uint16 ParityLayout[]);

};
