// Copyright (c) 2005 DMTF.  All rights reserved.
   [Version ( "2.11.0" ), 
    UMLPackagePath ( "CIM::Device::StorageServices" ), 
    Description ( 
       "StorageSetting is roughly equivalent to a Service Level "
       "Agreement (SLA) It defines the characteristics, qualities of "
       "service and goals when used in a CreateOrModifyElement "
       "FromStoragePool or CreateOrModifyStoragePool method in the "
       "StorageConfigurationService. It specifies a series of "
       "properties with Maximum and Minimum values that define the "
       "(inclusive) bounds that the object should maintain. Note that "
       "the setting is associated to a StorageVolume or LogicalDisk, "
       "using ElementSetting. \n"
       "The use of these properties differs depending on whether the "
       "StorageSetting instance is being used as a goal for a "
       "configuration operation or being used as a Service Level "
       "Agreement for a created Volume. In addition the properties "
       "fall into two categories: The QOS "
       "properties(PackageRedundancy, Data Redundancy, & "
       "NoSinglePointOfFailure) and the Detailed RAID "
       "properties(ExtentStripeLength, ParityLayout, and "
       "UserDataStripeDepth). In a Setting used as a goal, the QOS "
       "properties are required as a set; The Detailed RAID "
       "properties(if supported as indicated by the scoping "
       "StorageCapabilities instance) may be used optionally in any "
       "combination. The implementation MUST supply it\'s own best "
       "practice in the case where one or more supported RAID "
       "properties are not supplied. In this situation the use of "
       "StorageSettingWithHints can be useful to provide direction to "
       "the implementation. \n"
       "In a Setting used as a service agreement for a Volume, the QOS "
       "properties reflect the Service Level Agreement, with goal, "
       "min, & max. The actual current service level is exposed by "
       "corresponding values in StorageExtent. \n"
       "The Detailed RAID properties, by contrast, reflect specific "
       "values that reflect the RAID construction of the Volume. Only "
       "the primary values are meaningful; Min and Max are set to "
       "match. \n"
       "Certain StorageSetting instances may be classed as \"Fixed\", "
       "by using the \"ChangeableType\" property, indicating the "
       "setting is preset. Such settings are used when the possible "
       "setting variations are low enough to be instantiated in their "
       "entirety. The StorageCapabilities \"CreateSetting\" method MAY "
       "NOT be used to return settings that are not changeable. \n"
       "Other StorageSetting instances are created using the "
       "\"CreateSetting\" method. If the capabilities specifies "
       "ranges, then the setting can be used by a client to narrow the "
       "range to particular values within the range. In other words, "
       "the capabilities MAY be broad, but the related setting MUST be "
       "as capable or less capable, that is more narrowly defined, "
       "before it is used to create or modify resources. \n"
       "These created StorageSetting instances MUST have their "
       "\"ChangeableType\" property = 1, \"Changeable - Transient\". \n"
       "GeneratedSettings MAY not remain after the restart or reset of "
       "the implementation. They may be deleted by implementation at "
       "any time. A reasonable minimal time to retain the generated "
       "transient settings is five minutes, although there is no "
       "minimal retention time." )]
class CIM_StorageSetting : CIM_SettingData {

      [Write, Description ( 
          "Indicates the desired value for No Single Point of "
          "Failure. Possible values are false = single point of "
          "failure, and true = no single point of failure." )]
   boolean NoSinglePointOfFailure;

      [Write, Description ( 
          "DataRedundancyMax describes the maximum number of "
          "complete copies of data to 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 desired redundancy is specified using "
          "DataRedundancyGoal, while the minimum is defined by "
          "DataRedundancyMin." ), 
       MinValue ( 1 ), 
       ModelCorrespondence { "CIM_StorageSetting.DataRedundancyMin", 
          "CIM_StorageSetting.DataRedundancyGoal" }]
   uint16 DataRedundancyMax;

      [Write, Description ( 
          "DataRedundancyMin describes the minimum number of "
          "complete copies of data to 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 desired redundancy is specified using "
          "DataRedundancyGoal, while the maximum is defined by "
          "DataRedundancyMax." ), 
       MinValue ( 1 ), 
       ModelCorrespondence { "CIM_StorageSetting.DataRedundancyMax", 
          "CIM_StorageSetting.DataRedundancyGoal" }]
   uint16 DataRedundancyMin;

      [Write, Description ( 
          "DataRedundancyGoal describes the desired number of "
          "complete copies of data to 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 (max and min) for redundancy are defined "
          "using the properties, DataRedundancyMax and "
          "DataRedundancyMin." ), 
       MinValue ( 1 ), 
       ModelCorrespondence { "CIM_StorageSetting.DataRedundancyMax", 
          "CIM_StorageSetting.DataRedundancyMin" }]
   uint16 DataRedundancyGoal;

      [Write, Description ( 
          "PackageRedundancyMax describes the maximum number of "
          "redundant packages to 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 desired redundancy is specified "
          "using PackageRedundancyGoal, while the minimum is "
          "defined by PackageRedundancyMin." ), 
       ModelCorrespondence { 
          "CIM_StorageSetting.PackageRedundancyMin", 
          "CIM_StorageSetting.PackageRedundancyGoal" }]
   uint16 PackageRedundancyMax;

      [Write, Description ( 
          "PackageRedundancyMin describes the minimum number of "
          "redundant packages to 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 desired redundancy is specified "
          "using PackageRedundancyGoal, while the maximum is "
          "defined by PackageRedundancyMax." ), 
       ModelCorrespondence { 
          "CIM_StorageSetting.PackageRedundancyMax", 
          "CIM_StorageSetting.PackageRedundancyGoal" }]
   uint16 PackageRedundancyMin;

      [Write, Description ( 
          "PackageRedundancyGoal describes the desired number of "
          "redundant packages to 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 (max and min) for "
          "redundancy are defined using the properties, "
          "PackageRedundancyMax and PackageRedundancyMin." ), 
       ModelCorrespondence { 
          "CIM_StorageSetting.PackageRedundancyMax", 
          "CIM_StorageSetting.PackageRedundancyMin" }]
   uint16 PackageRedundancyGoal;

      [Write, Description ( 
          "DeltaReservationMax is a number between 1 (1%) and a 100 "
          "(100%) which specifies the maximum amount of space that "
          "should be reserved in a replica for caching changes. For "
          "a complete copy this would be 100%. The desired "
          "reservation is specified using DeltaReservationGoal, "
          "while the minimum is defined by DeltaReservationMin." ), 
       Units ( "Percentage" ), 
       MinValue ( 1 ), 
       MaxValue ( 100 ), 
       ModelCorrespondence { 
          "CIM_StorageSetting.DeltaReservationMin", 
          "CIM_StorageSetting.DeltaReservationGoal" }]
   uint8 DeltaReservationMax;

      [Write, Description ( 
          "DeltaReservationMin is a number between 1 (1%) and a 100 "
          "(100%) which specifies the minimum amount of space that "
          "should be reserved in a replica for caching changes. For "
          "a complete copy this would be 100%. The desired "
          "reservation is specified using DeltaReservationGoal, "
          "while the maximum is defined by DeltaReservationMax." ), 
       Units ( "Percentage" ), 
       MinValue ( 1 ), 
       MaxValue ( 100 ), 
       ModelCorrespondence { 
          "CIM_StorageSetting.DeltaReservationMax", 
          "CIM_StorageSetting.DeltaReservationGoal" }]
   uint8 DeltaReservationMin;

      [Write, Description ( 
          "DeltaReservationGoal is a number between 1 (1%) and a "
          "100 (100%) which specifies the desired amount of space "
          "that should be reserved in a replica for caching "
          "changes. For a complete copy this would be 100%. The "
          "bounds (max and min) for the reservation are defined "
          "using the properties, DeltaReservationMax and "
          "DeltaReservationMin." ), 
       Units ( "Percentage" ), 
       MinValue ( 1 ), 
       MaxValue ( 100 ), 
       ModelCorrespondence { 
          "CIM_StorageSetting.DeltaReservationMin", 
          "CIM_StorageSetting.DeltaReservationMax" }]
   uint8 DeltaReservationGoal;

      [Override ( "ChangeableType" ), 
       Description ( 
          "Enumeration indicating the type of setting. \"Fixed - "
          "Not Changeable\" settings are primordial. These setting "
          "are defined at the implementor of the class. \"Changeable "
          "- Transient\" is the type of setting produced by the "
          "\"CreateSetting\" method. A client can subsequently "
          "request that the implementation persist the generated "
          "and potentially modified setting indefinately. Only a "
          "\"Changeable - Transient\" setting SHALL be converted to "
          "a \"Changeable = Persistent\" setting; the setting SHALL "
          "NOT be changed back." ), 
       ValueMap { "0", "1", "2" }, 
       Values { "Fixed - Not Changeable", "Changeable - Transient", 
          "Changeable - Persistent" }]
   uint16 ChangeableType;

      [Write, Description ( 
          "ExtentStripeLength 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\'. "
          "When used in a goal setting instance, ExtentStripeLength "
          "is the optimal desired value. The bounds (max and min) "
          "for Stripe Length are defined using the properties "
          "ExtentStripeLengthMax and ExtentStripeLengthMin. "
          "ExtentStripeLength MUST be set to NULL if the scoping "
          "StorageCapablities indicates that it is not supported in "
          "this context. ExtentStripeLength can be used in "
          "conjunction with CreateOrModifyElementFromELements to "
          "explicitly configure storage. An example would be RAID "
          "0+1 with mirroring two stripe sets, each set being three "
          "wide. In this case CreateOrModifyElementFromElements "
          "would be passed a goal setting with DataRedundancy = 2 "
          "and ExtentStripeLength = 3. The size of the InElements "
          "array would be 6 and would contain the StorageExtents to "
          "be used to construct the StorageElement as a RAID 0+1. "
          "ExtentStripeLengthMin and ExtentStripeLengthMax are "
          "meaningless and wouldbe set to NULL. If the property is "
          "supported, and is part of StorageSettingWithHints it MAY "
          "be set to NULL. If used it will constrain the effects of "
          "Hint selections. When used in a Setting instance "
          "associated to a Volume, this property indicates the "
          "specific value that the Volume was created with, and "
          "ExtentStripeLengthMin and ExtentStripeLengthMax will be "
          "set to the same specific value." ), 
       MinValue ( 1 ), 
       ModelCorrespondence { 
          "CIM_StorageSetting.ExtentStripeLengthMax", 
          "CIM_StorageSetting.ExtentStripeLengthMin" }]
   uint16 ExtentStripeLength;

      [Write, Description ( 
          "ExtentStripeLength 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\'. "
          "When used in a goal setting instance, "
          "ExtentStripeLengthMin is the minimum acceptable value. "
          "The desired Stripe Length is specified using "
          "ExtentStripeLength, while the maximum is defined by "
          "ExtentStripeLengthMax. ExtentStripeLengthMin MUST be set "
          "to NULL if the scoping StorageCapablities indicates that "
          "it is not supported in this context. If the property is "
          "supported, and is part of StorageSettingWithHints it MAY "
          "be set to NULL. If used it will constrain the effects of "
          "Hint selections. When used in a Setting instance "
          "associated to a Volume, this property is set to the "
          "specific value of ExtentStripeLength." ), 
       MinValue ( 1 ), 
       ModelCorrespondence { 
          "CIM_StorageSetting.ExtentStripeLengthMax", 
          "CIM_StorageSetting.ExtentStripeLength" }]
   uint16 ExtentStripeLengthMin;

      [Write, Description ( 
          "ExtentStripeLength 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\'. "
          "When used in a goal setting instance, "
          "ExtentStripeLengthMax is the maximum acceptable value. "
          "The desired Stripe Length is specified using "
          "ExtentStripeLength, while the minimum is defined by "
          "ExtentStripeLengthMin. ExtentStripeLengthMax MUST be set "
          "to NULL if the scoping StorageCapablities indicates that "
          "it is not supported in this context. If the property is "
          "supported, and is part of StorageSettingWithHints it MAY "
          "be set to NULL. If used it will constrain the effects of "
          "Hint selections. When used in a Setting instance "
          "associated to a Volume, this property is set to the "
          "specific value of ExtentStripeLength." ), 
       MinValue ( 1 ), 
       ModelCorrespondence { 
          "CIM_StorageSetting.ExtentStripeLengthMin", 
          "CIM_StorageSetting.ExtentStripeLength" }]
   uint16 ExtentStripeLengthMax;

      [Write, Description ( 
          "ParityLayout specifies whether a parity-based storage "
          "organization is using rotated or non-rotated parity. "
          "When used in a goal setting instance, ParityLayout is "
          "the desired value. It MUST be set to NULL if the scoping "
          "StorageCapablities indicates that it is not supported in "
          "this context. If the property is supported, and is part "
          "of StorageSettingWithHints it MAY be set to NULL. If "
          "used it will constrain the effects of Hint selections. "
          "When used in a Setting instance associated to a Volume, "
          "this property indicates the specific value that the "
          "Volume was created with." ), 
       ValueMap { "1", "2" }, 
       Values { "Non-rotated Parity", "Rotated Parity" }]
   uint16 ParityLayout;

      [Write, Description ( 
          "UserDataStripeDepth 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. When used in a goal "
          "setting instance, UserDataStripeDepth is the optimal "
          "desired value. The bounds (max and min) for Stripe Depth "
          "are defined using the properties UserDataStripeDepthMax "
          "and UserDataStripeDepthMin. UserDataStripeDepth MUST be "
          "set to NULL if the scoping StorageCapablities indicates "
          "that it is not supported in this context. If the "
          "property is supported, and is part of "
          "StorageSettingWithHints it MAY be set to NULL. If used "
          "it will constrain the effects of Hint selections. When "
          "used in a Setting instance associated to a Volume, this "
          "property indicates the specific value that the Volume "
          "was created with, and UserDataStripeDepthMin and "
          "UserDataStripeDepthMax will be set to the same specific "
          "value." ), 
       Units ( "Bytes" ), 
       MinValue ( 1 ), 
       ModelCorrespondence { 
          "CIM_StorageSetting.UserDataStripeDepthMax", 
          "CIM_StorageSetting.UserDataStripeDepthMin" }]
   uint64 UserDataStripeDepth;

      [Write, Description ( 
          "UserDataStripeDepth 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. When used in a goal "
          "setting instance, UserDataStripeDepthMin is the minimum "
          "acceptable value. The desired Stripe Depth is specified "
          "using UserDataStripeDepth, while the maximum is defined "
          "by UserDataStripeDepthMax. UserDataStripeDepthMin MUST "
          "be set to NULL if the scoping StorageCapablities "
          "indicates that it is not supported in this context. If "
          "the property is supported, and is part of "
          "StorageSettingWithHints it MAY be set to NULL. If used "
          "it will constrain the effects of Hint selections. When "
          "used in a Setting instance associated to a Volume, this "
          "property is set to the specific value of "
          "UserDataStripeDepth." ), 
       Units ( "Bytes" ), 
       MinValue ( 1 ), 
       ModelCorrespondence { 
          "CIM_StorageSetting.UserDataStripeDepthMax", 
          "CIM_StorageSetting.UserDataStripeDepth" }]
   uint64 UserDataStripeDepthMin;

      [Write, Description ( 
          "UserDataStripeDepth 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. When used in a goal "
          "setting instance, UserDataStripeDepthMax is the maximum "
          "acceptable value. The desired Stripe Depth is specified "
          "using UserDataStripeDepthGoal, while the minimum is "
          "defined by UserDataStripeDepthMin. "
          "UserDataStripeDepthMax MUST be set to NULL if the "
          "scoping StorageCapablities indicates that it is not "
          "supported in this context. If the property is supported, "
          "and is part of StorageSettingwWithHints it MAY be set to "
          "NULL. If used it will constrain the effects of Hint "
          "selections. When used in a Setting instance associated "
          "to a Volume, this property is set to the specific value "
          "of UserDataStripeDepth." ), 
       Units ( "Bytes" ), 
       MinValue ( 1 ), 
       ModelCorrespondence { 
          "CIM_StorageSetting.UserDataStripeDepthMin", 
          "CIM_StorageSetting.UserDataStripeDepth" }]
   uint64 UserDataStripeDepthMax;


};
