// This contains a small subset of the core, so we can run the tests faster
Qualifier Abstract : boolean = false, Scope(class, association, 
        indication), Flavor(DisableOverride, Restricted);
Qualifier Association : boolean = false, Scope(class, association), 
        Flavor(DisableOverride);
Qualifier Key : boolean = false, Scope(property, reference), 
        Flavor(DisableOverride);
Qualifier Override : string = null, Scope(property, method, 
        reference);
Qualifier Description : string = null, Scope(any), 
        Flavor(Translatable);
Qualifier Expensive : boolean = false, 
        Scope(property, reference, method, class, association);
Qualifier In : boolean = true, Scope(parameter);
Qualifier Provider : string = null, Scope(any);
Qualifier MaxLen : uint32 = null, Scope(property, method, 
	parameter);
Qualifier MappingStrings : string[],
	Scope(class, property, association, indication, reference);
Qualifier ValueMap : string[], Scope(property, method, parameter);
Qualifier ArrayType : string = "Bag", Scope(property, parameter);
Qualifier ModelCorrespondence : string[], Scope(property);
Qualifier Values : string[], Scope(property, method, parameter), 
	Flavor(Translatable);
Qualifier Aggregation : boolean = false, Scope(association),
	Flavor(DisableOverride);
Qualifier Aggregate: boolean = false, Scope (reference),
	Flavor(DisableOverride);
Qualifier Out : boolean = false, Scope(parameter),
	Flavor(DisableOverride);
Qualifier Required : boolean = false, 
    Scope(property, reference, parameter),
    Flavor(DisableOverride);




// ==================================================================
// ManagedElement
// ================================================================== 
   [Abstract, Description (
   "ManagedElement is an abstract class that provides a common "  
	"superclass (or top of the inheritance tree) for the "
	"non-association classes in the CIM Schema.")]
   class CIM_ManagedElement   
   {  
     [MaxLen (64), Description (  
      "The Caption property is a short textual description (one-"    
      "line string) of the object.") ]   
     string Caption;  
     [Description (  
      "The Description property provides a textual description of "
      "the object.") ]   
     string Description;    
   };
     
// ==================================================================
// Collection 
// ================================================================== 
  [Abstract, Description (   
   "Collection is an abstract class that provides a common"   
   "superclass for data elements that represent collections of "
   "ManagedElements and its subclasses.")]
  class CIM_Collection : CIM_ManagedElement    
  {   
  };

// ================================================================== 
//    ManagedSystemElement
// ==================================================================
        [Abstract, Description (
         "CIM_ManagedSystemElement is the base class for the System "
         "Element hierarchy. Membership Criteria: Any distinguishable "
         "component of a System is a candidate for inclusion in this "
         "class. Examples: software components, such as files; and "
         "devices, such as disk drives and controllers, and physical "
  	   "components such as chips and cards.") ] 
class CIM_ManagedSystemElement : CIM_ManagedElement
{
        [Description (
         "A datetime value indicating when the object was installed. "
         "A lack of a value does not indicate that the object is not "
         "installed."), 
         MappingStrings {"MIF.DMTF|ComponentID|001.5"} ] 
    datetime InstallDate;
        [MaxLen (256), Description (
         "The Name property defines the label by which the object is "
	   "known. When subclassed, the Name property can be overridden "
         "to be a Key property.") ] 
    string Name;
         [MaxLen (10), Description ( 
         "  A string indicating the current status of the object. " 
         "Various operational and non-operational statuses are " 
         "defined. Operational statuses are \"OK\", \"Degraded\", " 
         "\"Stressed\" and \"Pred Fail\". \"Stressed\" indicates that " 
         "the Element is functioning, but needs attention. Examples " 
         "of \"Stressed\" states are overload, overheated, etc. The " 
         "condition \"Pred Fail\" (failure predicted) indicates that " 
         "an Element is functioning properly but predicting a failure " 
         "in the near future. An example is a SMART-enabled hard " 
         "drive. \n" 
         "  Non-operational statuses can also be specified. These " 
         "are \"Error\", \"NonRecover\", \"Starting\", \"Stopping\", " 
         " \"Stopped\", " 
         "\"Service\", \"No Contact\" and \"Lost Comm\". \"NonRecover\" " 
         "indicates that a non-recoverable error has occurred. " 
         "\"Service\" describes an Element being configured, maintained, " 
         "cleaned, or otherwise administered. This status could apply " 
         "during mirror-resilvering of a disk, reload of a user " 
         "permissions list, or other administrative task. Not all such " 
         "work is on-line, yet the Element is neither \"OK\" nor in " 
         "one of the other states. \"No Contact\" indicates that the " 
         "current instance of the monitoring system has knowledge of " 
         "this Element but has never been able to establish " 
         "communications with it. \"Lost Comm\" indicates that " 
         "the ManagedSystemElement is known to exist and has been " 
         "contacted successfully in the past, but is currently unreachable." 
         "\"Stopped\" indicates that the ManagedSystemElement is known " 
         "to exist, it is not operational (i.e. it is unable to " 
         "provide service to users), but it has not failed. It has purposely " 
         "been made non-operational. The Element " 
         "may have never been \"OK\", the Element may have initiated its " 
         "own stop, or a management system may have initiated the stop."), 
         ValueMap {"OK", "Error", "Degraded", "Unknown", "Pred Fail", 
             "Starting", "Stopping", "Service", "Stressed", 
             "NonRecover", "No Contact", "Lost Comm", "Stopped"} ] 
    string Status; 
};

// ==================================================================
//    LogicalElement
// ==================================================================
        [Abstract, Description (
         "CIM_LogicalElement is a base class for all the components of "
         "a System that represent abstract system components, such "
         "as Files, Processes, or system capabilities in the form "
         "of Logical Devices.") ] 
class CIM_LogicalElement:CIM_ManagedSystemElement
{
};
     
// ==================================================================
//    System
// ==================================================================
        [Abstract, Description (
         "A CIM_System is a LogicalElement that aggregates an "
         "enumerable set of Managed System Elements. The aggregation "
         "operates as a functional whole. Within any particular "
         "subclass of System, there is a well-defined list of "
         "Managed System Element classes whose instances must be "
         "aggregated.") ] 
class CIM_System:CIM_LogicalElement
{
        [Key, MaxLen (256), Description (
         "CreationClassName indicates the name of the class or the "
         "subclass used in the creation of an instance. When used "
         "with the other key properties of this class, this property "
         "allows all instances of this class and its subclasses to "
         "be uniquely identified.") ]
    string CreationClassName;
        [Key, MaxLen (256), Override ("Name"), Description (
         "The inherited Name serves as key of a System instance in " 
         "an enterprise environment.") ] 
    string Name;
        [MaxLen (64), Description (
         "The System object and its derivatives are Top Level Objects "
         "of CIM. They provide the scope for numerous components. " 
         "Having unique System keys is required. A heuristic can be "
         "defined in individual System subclasses to attempt to always "
         "generate the same System Name Key. The NameFormat property "
         "identifies how the System name was generated, using "
         "the subclass' heuristic.") ] 
    string NameFormat;
        [MaxLen (256), Description (
         "A string that provides information on how the primary system "
         "owner can be reached (e.g. phone number, email address, "
	   "...)."),
         MappingStrings {"MIF.DMTF|General Information|001.3"} ] 
    string PrimaryOwnerContact;
        [MaxLen (64), Description (
	   "The name of the primary system owner."),
         MappingStrings {"MIF.DMTF|General Information|001.4"} ]  
    string PrimaryOwnerName;
        [Description (
         "An array (bag) of strings that specify the roles this System "
         "plays in the IT-environment. Subclasses of System may "
         "override this property to define explicit Roles values. "
         "Alternately, a Working Group may describe the heuristics, "
         "conventions and guidelines for specifying Roles. For "
         "example, for an instance of a networking system, the Roles "
         "property might contain the string, 'Switch' or 'Bridge'.") ]
    string Roles[];
};

// ===================================================================
//    ComputerSystem
// ===================================================================
	  [Abstract, Description (
         "A class derived from System that is a special collection of "
         "ManagedSystemElements. This collection provides "
         "compute capabilities and serves as aggregation point to "
         "associate one or more of the following elements: FileSystem, "
         "OperatingSystem, Processor and Memory (Volatile and/or "
         "NonVolatile Storage).") ] 
class CIM_ComputerSystem : CIM_System
{
        [Override ("NameFormat"), Description (
 	   "The ComputerSystem object and its derivatives are Top Level "
	   "Objects of CIM. They provide the scope for numerous "
	   "components. Having unique System keys is required. "
	   "A heuristic is defined to create the ComputerSystem Name "
	   "to attempt to always generate the same Name, independent of "
	   "discovery protocol. This prevents inventory and management "
	   "problems where the same asset or entity is discovered "
	   "multiple times, but can not be resolved to a single object. "
	   "Use of the heuristic is optional, but recommended.\n\n"
	   "The NameFormat property identifies how the ComputerSystem "
	   "Name is generated, using a heuristic. The heuristic is "
	   "outlined, in detail, in the CIM V2 System Model spec. "
	   "It assumes that the documented rules are traversed in order, "
	   "to determine and assign a Name. The NameFormat Values "
	   "list defines the precedence order for assigning the Computer"
	   "System Name. Several rules do map to the same Value.\n\n"
	   "Note that the ComputerSystem Name calculated using the "
	   "heuristic is the System's key value. Other names can be "
	   "assigned and used for the ComputerSystem, that better suit "
	   "a business, using Aliases."), 
         ValueMap {"Other", "IP", "Dial", "HID", "NWA", "HWA", "X25", 
	       "ISDN", "IPX", "DCC", "ICD", "E.164", "SNA", "OID/OSI"} ]
   string NameFormat;
        [MaxLen (256), ArrayType ("Indexed"), 
         Description (
         "OtherIdentifyingInfo captures additional data, beyond "
         "System Name information, that could be used to identify "
         "a ComputerSystem. One example would be to hold the "
         "Fibre Channel World-Wide Name (WWN) of a node. Note that "
         "if only the Fibre Channel name is available and is "
         "unique (able to be used as the System key), then this "
         "property would be NULL and the WWN would become the "
         "System key, its data placed in the Name property."),
         ModelCorrespondence {
          "CIM_ComputerSystem.IdentifyingDescriptions"} ]
   string OtherIdentifyingInfo[];
        [ArrayType ("Indexed"), Description (
         "An array of free-form strings providing explanations "
         "and details behind the entries in the OtherIdentifying"
         "Info array. Note, each entry of this array is related "
         "to the entry in OtherIdentifyingInfo that is located at "
         "the same index."),
         ModelCorrespondence {
          "CIM_ComputerSystem.OtherIdentifyingInfo"} ]
   string IdentifyingDescriptions[];
        [Description (
         "Enumeration indicating whether the ComputerSystem is "
         "a special-purpose System (ie, dedicated to a particular "
         "use), versus being 'general purpose'. For example, one "
         "could specify that the System is dedicated to \"Print\" "
         "(value=11) or acts as a \"Hub\" (value=8)."),
         Values {"Not Dedicated", "Unknown", "Other", "Storage", 
          "Router", "Switch", "Layer 3 Switch", 
          "Central Office Switch", "Hub", "Access Server", 
          "Firewall", "Print", "I/O", "Web Caching", "Management"} ]
   uint16 Dedicated[];
};
     
// ==================================================================
//    Component
// ==================================================================
        [Association, Abstract, Aggregation, Description (
         "CIM_Component is a generic association used to establish "
         "'part of' relationships between Managed System Elements. For "
         "example, the SystemComponent association defines parts of "
         "a System.") ] 
class CIM_Component
{
        [Aggregate, Key, Description (
         "The parent element in the association.") ] 
    CIM_ManagedSystemElement REF GroupComponent;
        [Key, Description ("The child element in the association.") ] 
    CIM_ManagedSystemElement REF PartComponent;
};
     
// ==================================================================
//    SystemComponent
// ==================================================================
        [Association, Aggregation, Description (
         "CIM_SystemComponent is a specialization of the CIM_Component "
         "association that establishes 'part of' relationships between "
         "a System and the Managed System Elements of which it is "
	   "composed.") ] 
class CIM_SystemComponent:CIM_Component
{
        [Override ("GroupComponent"), Aggregate, 
         Description ("The parent System in the Association.") ] 
    CIM_System REF GroupComponent;
        [Override ("PartComponent"), Description (
         "The child element that is a component of a System.") ] 
    CIM_ManagedSystemElement REF PartComponent;
};
     
