summaryrefslogtreecommitdiffstats
path: root/Schemas/CIM228/DMTF/Device/CIM_ControllerConfigurationService.mof
diff options
context:
space:
mode:
Diffstat (limited to 'Schemas/CIM228/DMTF/Device/CIM_ControllerConfigurationService.mof')
-rw-r--r--Schemas/CIM228/DMTF/Device/CIM_ControllerConfigurationService.mof497
1 files changed, 497 insertions, 0 deletions
diff --git a/Schemas/CIM228/DMTF/Device/CIM_ControllerConfigurationService.mof b/Schemas/CIM228/DMTF/Device/CIM_ControllerConfigurationService.mof
new file mode 100644
index 0000000..29dd01d
--- /dev/null
+++ b/Schemas/CIM228/DMTF/Device/CIM_ControllerConfigurationService.mof
@@ -0,0 +1,497 @@
+// Copyright (c) 2005 DMTF. All rights reserved.
+ [Version ( "2.10.0" ),
+ UMLPackagePath ( "CIM::Device::ProtocolController" ),
+ Description (
+ "The ControllerConfigurationService provides methods that allow "
+ "a client to manipulate LUN Masking in a storage system." )]
+class CIM_ControllerConfigurationService : CIM_Service {
+
+
+ [Description (
+ "This method creates an appropriate subclass of "
+ "ProtocolController. In addition to its role of "
+ "controlling downstream devices, a ProtocolControl is "
+ "used to provide a central management point for access "
+ "control with respect to those devices. Certain storage "
+ "system implementations across multiple vendors require "
+ "permissions to be established atomically with the "
+ "creation of a ProtocolController. This method provides "
+ "this capability via the Privilege and Identity "
+ "properties. By supplying appropriate information in "
+ "those properties, this method will assure that "
+ "appropriate AuthorizedTarget and AuthorizedSubject "
+ "associations, (as defined in the User and Security "
+ "Model), are instantiated to restrict access to the "
+ "logical devices \'behind\' it. \n"
+ "If multiple target ports are specified in the Ports "
+ "input parameter, all expose the same view (i.e., have "
+ "the same unit numbers and permissions). This method does "
+ "not create the port instances, but does create "
+ "ProtocolControllerForPort associations between the "
+ "specified ports and the new ProtocolController. The new "
+ "ProtocolController is defined to be weak to the same "
+ "System as the ControllerConfigurationService." ),
+ ValueMap { "0", "1", "2", "3", "4", "5", "6..4095", "4096",
+ "4097", "4098", "4099..32767", "32768..65535" },
+ Values { "Success", "Not Supported", "Unspecified Error",
+ "Timeout", "Failed", "Invalid Parameter", "DMTF Reserved",
+ "ID Parameter Missing or Not Unique",
+ "Hardware Implementation Requires Null Ports Parameter",
+ "Busy", "Method Reserved", "Vendor Specific" }]
+ uint32 CreateProtocolControllerWithPorts(
+ [IN, Description (
+ "The string to be used in the ElementName of the "
+ "new ProtocolController." ),
+ ModelCorrespondence {
+ "CIM_ProtocolController.ElementName" }]
+ string ElementName,
+ [IN, Description (
+ "Array of strings containing representations of "
+ "references to instances of CIM_LogicalPort (or "
+ "subclass) instances. This is the list of target "
+ "ports that are associated to the "
+ "ProtocolController. ProtocolControllerForPort "
+ "associations are created by the instrumentation "
+ "associating the new ProtocolController to these "
+ "ports. If this parameter is null, then all ports "
+ "in the storage system (this Service\'s \'scoping\' "
+ "System and all its ComponentCS Systems) are "
+ "attached to the new ProtocolController." )]
+ string Ports[],
+ [IN, Description (
+ "The protocol type for the new ProtocolController." ),
+ ValueMap { "0", "1", "2" },
+ Values { "Unknown", "Other", "SCSI" },
+ ModelCorrespondence { "CIM_SCSIProtocolController" }]
+ uint16 Protocol,
+ [IN, Description (
+ "Reference to a CIM_Privilege (or subclass) "
+ "instance to be used as a template. If supplied, it "
+ "has a 1:1 correspondence with the Identity "
+ "parameter and this method will atomically create "
+ "the new ProtocolController instance and related "
+ "AuthorizedPrivilege, AuthorizedTarget and "
+ "AuthorizedSubject instances. \n"
+ "Note: if "
+ "ProtocolControllerRequiresAuthorizedIdentity is "
+ "true, then the Identity/Privilege pair MUST be "
+ "specified. If false, then the Identity/Privilege "
+ "pair MUST NOT be specified." ),
+ ModelCorrespondence {
+ "CIM_ControllerConfigurationService.CreateProtocolControllerWithPorts.Identity" }]
+ CIM_Privilege REF Privilege,
+ [IN, Description (
+ "Reference to a CIM_ManagedElement (or subclass) "
+ "instance. This ManagedElement MUST be either a "
+ "CIM_Identity, or a CIM_Collection (or subclass, "
+ "eg. SystemSpecificCollection, Role, or Group) that "
+ "has CIM_Identities as MemberOfCollection. If "
+ "ProtocolControllerMaskingCapabilities.ProtocolControllerSupportsCollection "
+ "is false, the reference MUST be to a CIM_Identity "
+ "(or subclass). If present, it has a 1:1 "
+ "correspondence with the Privilege property. If "
+ "present, this method will atomically create the "
+ "new ProtocolController instance and instantiate a "
+ "missing AuthorizedSubject association between the "
+ "Privilege/Identity pair; and instantiate an "
+ "AuthorizedTarget association between the "
+ "AuthorizedPrivilege and the new "
+ "ProtocolController. \n"
+ "Note: if "
+ "ProtocolControllerRequiresAuthorizedIdentity is "
+ "true, then at least the Identity/Privilege pair "
+ "MUST be specified." ),
+ ModelCorrespondence {
+ "CIM_ControllerConfigurationService.CreateProtocolControllerWithPorts.Privilege" }]
+ CIM_ManagedElement REF Identity,
+ [IN ( false ), OUT, Description (
+ "A reference to the new ProtocolController that is created."
+ )]
+ CIM_ProtocolController REF ProtocolController);
+
+ [Description (
+ "The method deletes an instance of ProtocolController and "
+ "all associations in which this ProtocolController is "
+ "referenced." ),
+ ValueMap { "0", "1", "2", "3", "4", "5", "6..4095", "4096",
+ "4097", "4098..32767", "32768..65535" },
+ Values { "Success", "Not Supported", "Unspecified Error",
+ "Timeout", "Failed", "Invalid Parameter", "DMTF Reserved",
+ "LogicalDevices Associated to Other ProtocolControllers Not Deleted",
+ "Busy", "Method Reserved", "Vendor Specific" }]
+ uint32 DeleteProtocolController(
+ [IN, Description (
+ "The ProtocolController to be deleted." )]
+ CIM_ProtocolController REF ProtocolController,
+ [IN, Description (
+ "If true, the management instrumentation provider "
+ "will also delete \'child\' ProtocolControllers "
+ "(i.e., those defined as Dependent references in "
+ "instances of AssociatedProtocolController where "
+ "this ProtocolController is the Antecedent "
+ "reference). Also, all direct associations "
+ "involving the \'child\' ProtocolControllers will "
+ "be removed." )]
+ boolean DeleteChildrenProtocolControllers,
+ [IN, Description (
+ "If true, the management instrumentation provider "
+ "will also delete LogicalDevice instances "
+ "associated via ProtocolControllerForUnit, to this "
+ "ProtocolController and its children. (Note that "
+ "\'child\' controllers will only be affected if the "
+ "DeleteChildrenProtocolControllers input parameter "
+ "is TRUE). LogicalDevice instances are only deleted "
+ "if there are NO remaining "
+ "ProtocolControllerForUnit associations, to other "
+ "ProtocolControllers." )]
+ boolean DeleteUnits);
+
+ [Description (
+ "This method associates a LogicalDevice subclass "
+ "(specifically a StorageVolume or MediaAccessDevice "
+ "subclass) to the referenced ProtocolController. The "
+ "association is persisted as an instance of "
+ "ProtocolControllerForUnit. The management "
+ "instrumentation provider must verify that the logical "
+ "unit numbers (defined using the DeviceNumber input "
+ "parameter) are unique for the ProtocolController. When "
+ "the Protocol Controller is actively masking a device "
+ "(i.e. is part of an AuthorizedTarget association), the "
+ "provider should update the access configuration in the "
+ "underlying hardware as appropriate." ),
+ ValueMap { "0", "1", "2", "3", "4", "5", "6..4095", "4096",
+ "4097", "4098", "4099", "4100", "4101..32767",
+ "32768..65535" },
+ Values { "Success", "Not Supported", "Unspecified Error",
+ "Timeout", "Failed", "Invalid Parameter", "DMTF Reserved",
+ "Invalid LogicalDevice Instance",
+ "Device Number Conflict",
+ "DeviceNumber Parameter Must Be Provided",
+ "Hardware Implementation Requires Null DeviceNumber",
+ "Busy", "Method Reserved", "Vendor Specific" }]
+ uint32 AttachDevice(
+ [IN, Description ( "The ProtocolController instance." )]
+ CIM_ProtocolController REF ProtocolController,
+ [IN, Description (
+ "The LogicalDevice instance to attach." )]
+ CIM_LogicalDevice REF Device,
+ [IN, OUT, Description (
+ "The number assigned to "
+ "ProtocolControllerForUnit.DeviceNumber (if "
+ "supported by the hardware). Hardware support is "
+ "indicated by "
+ "ProtocolControllerMaskingCapabilities.ClientSelectableDeviceNumbers). "
+ "If the hardware does not support setting the "
+ "number, but the DeviceNumber has not been "
+ "established in an existing "
+ "ProtocolControllerForDevice subclass, then this "
+ "parameter\'s value will be used. If the "
+ "DeviceNumber has been established, then the "
+ "current number will be reused." ),
+ ModelCorrespondence {
+ "CIM_ProtocolControllerForUnit.DeviceNumber" }]
+ string DeviceNumber);
+
+ [Description (
+ "This method removes the ProtocolControllerForDevice "
+ "association subclass between the ProtocolController and "
+ "a LogicalDevice, such as a StorageVolume or a "
+ "MediaAccessDevice. When the ProtocolController is "
+ "actively masking a device (i.e. is part of an "
+ "AuthorizedTarget association, the management "
+ "instrumentation provider should update the hardware "
+ "access configuration when DetachDevice is called." ),
+ ValueMap { "0", "1", "2", "3", "4", "5", "6..4095", "4096",
+ "4097", "4098..32767", "32768..65535" },
+ Values { "Success", "Not Supported", "Unspecified Error",
+ "Timeout", "Failed", "Invalid Parameter", "DMTF Reserved",
+ "LogicalDevice Instance not Associated with Controller",
+ "Busy", "Method Reserved", "Vendor Specific" }]
+ uint32 DetachDevice(
+ [IN, Description ( "The ProtocolController instance." )]
+ CIM_ProtocolController REF ProtocolController,
+ [IN, Description (
+ "The LogicalDevice instance to detach." )]
+ CIM_LogicalDevice REF Device);
+
+ [Description (
+ "Expose a list of SCSI logical units (such as RAID "
+ "volumes or tape drives) to a list of initiators through "
+ "a list of target ports, through one or more "
+ "SCSIProtocolControllers (SPCs). \n"
+ "\n"
+ "The parameters for this method are: Job - null if no job "
+ "created, otherwise this is a reference to the job. "
+ "LUNames - the list of names of the logical units to use. "
+ "InitiatorPortIDs - the names of the initiator ports to "
+ "use. TargetPortIDs - the names of the target ports to "
+ "use. DeviceNumbers - the device numbers (LUNs) to use. "
+ "DeviceAccesses - permissions for the logical units. "
+ "ProtocolControllers - SPCs involved in this operation. \n"
+ "\n"
+ "There are two modes of operation, create and modify. If "
+ "a NULL value is passed in for the SPC, then the "
+ "instrumentation will create at least one SPC that "
+ "satisfies the request. Depending upon the "
+ "instrumentation capabilities, more than one SPC MAY be "
+ "created. (e.g. if "
+ "CIM_ProtocolControllerMaskingCapabilities.OneHardwareIDPerView "
+ "is true and more than one initiatorID was passed in, "
+ "then one SPC per initiatorID will be created). If an SPC "
+ "is passed in, then the instrumentation attempts to add "
+ "the new paths to the existing SPC. Depending upon the "
+ "instrumentation capabilities, this MAY result in the "
+ "creation of additional SPCs. The instrumentation MAY "
+ "return an error if honoring this request would violate "
+ "SCSI semantics. \n"
+ "\n"
+ "For creating an SPC, the parameters that MUST be "
+ "specified are dependent upon the SPCAllows* properties "
+ "in CIM_ProtocolControllerMaskingCapabilities. If "
+ "SPCAllowsNoLUs is false, the caller MUST specify a list "
+ "of LUNames. If it is true, the caller MAY specify a list "
+ "of LUNames or MAY pass in null. If SPCAllowsNoTargets is "
+ "false and PortsPerView is not \'All Ports share the same "
+ "view\' the caller MUST specify a list of TargetPortIDs. "
+ "If it is true, the caller MAY specify a list of "
+ "TargetPortIDs or MAY pass in null. If "
+ "SPCAllowsNoInitiators is false, the caller MUST specify "
+ "a list of InitiatorPortIDs. If it is true, the caller "
+ "MAY specify a list of InitiatorPortIDs or MAY pass in "
+ "null. If LUNames is not null, the caller MUST specify "
+ "DeviceAccesses for each logical unit. If the "
+ "instrumentation\'s "
+ "CIM_ProtocolControllerMaskingCapabilities "
+ "ClientSelectableDeviceNumbers property is TRUE then the "
+ "client MAY provide a list of device numbers (LUNs) to "
+ "use for the paths to be created. If is false, the client "
+ "MUST pass in NULL for this parameter. \n"
+ "\n"
+ "The LUNames, DeviceNumbers, and DeviceAccesses "
+ "parameters are mutually indexed arrays - any element in "
+ "DeviceNumbers or DeviceAccesses will set a property "
+ "relative to the LogicalDevice instance named in the "
+ "corresponding element of LUNames. LUNames and "
+ "DeviceAccesses MUST have the same number of elements. "
+ "DeviceNumbers MUST be null (asking the instrumentation "
+ "to assign numbers) or have the same number of elements "
+ "as LUNames. If these conditions are not met, the "
+ "instrumentation MUST return a \'Invalid Parameter\' "
+ "status or a CIM_Error. \n"
+ "\n"
+ "For modifying an SPC, there are three specific use cases "
+ "identified. The instrumentation MUST support these use "
+ "cases. Other permutations are allowed, but are "
+ "vendor-specific. The use cases are: Add LUs to a view, "
+ "Add initiator IDs to a view, and Add target port IDs to "
+ "a view. Add LUs to a view requires that the LUNames "
+ "parameter not be null and that the InitiatorIDs and "
+ "TargetPortIDs parameters be null. DeviceNumbers MAY be "
+ "null if ClientSelectableDeviceNumbers is false. "
+ "DeviceAccesses MUST be specified. Add initiator IDs to a "
+ "view requires that the LUNames parameter be null, that "
+ "the InitiatorIDs not be null, and that the TargetPortIDs "
+ "parameters be null. DeviceNumbers and DeviceAccesses "
+ "MUST be null. Add target port IDs to a view requires "
+ "that the LUNames and InitiatorPortIDs parameters be null "
+ "and is only possible is PortsPerView is \'Multiple Ports "
+ "Per View\'. DeviceNumbers and DeviceAccesses MUST also "
+ "be null \n"
+ "\n"
+ "The relevant rules of SCSI semantics are: \n"
+ "- an SPC MAY NOT be exposed through a particular "
+ "host/target port pair that is in use by another SPC. (In "
+ "other words, an SPC and its associated logical units and "
+ "ports together correspond to the logical unit inventory "
+ "provided by SCSI REPORT LUNS and INQUIRY commands) \n"
+ "- each LogicalDevice associated to an SPC MUST have a "
+ "unique ProtocolControllerForUnit DeviceNumber (logical "
+ "unit number) \n"
+ "The instrumentation MUST report an error if the client "
+ "request would violate one of these rules. \n"
+ "\n"
+ "If the instrumentation provides "
+ "PrivilegeManagementService, the results of setting "
+ "DeviceAccesses MUST be synchronized with "
+ "PrivilegeManagementService as described in the "
+ "ProtocolControllerForUnit DeviceAccess description." ),
+ ValueMap { "0", "1", "2", "3", "4", "5", "6..4095", "4096",
+ "4097", "4098", "4099", "4100", "4101", "4102", "4103",
+ "4104..32767", "32768..65535" },
+ Values { "Success", "Not Supported", "Unspecified Error",
+ "Timeout", "Failed", "Invalid Parameter", "DMTF Reserved",
+ "Method Parameters Checked - Job Started",
+ "Invalid logical unit ID", "Invalid initiator port ID",
+ "Invalid target port ID", "Invalid permission",
+ "Target/initiator combination already exposed",
+ "Requested logical unit number in use",
+ "Maximum Map Count Exceeded", "Method Reserved",
+ "Vendor Specific" }]
+ uint32 ExposePaths(
+ [IN ( false ), OUT, Description (
+ "Reference to the job if \'Method Parameters "
+ "Checked - Job Started\' is returned (MAY be null "
+ "if job completed)." )]
+ CIM_ConcreteJob REF Job,
+ [Required, IN, Description (
+ "An array of IDs of logical unit instances. The LU "
+ "instances MUST already exist. The members of this "
+ "array MUST match the Name property of "
+ "LogicalDevice instances that represent SCSI "
+ "logical units. See the method description for "
+ "conditions where this MAY be null." ),
+ ArrayType ( "Indexed" ),
+ ModelCorrespondence { "CIM_LogicalDevice.Name",
+ "CIM_ControllerConfigurationService.ExposePaths.DeviceNumbers",
+ "CIM_ControllerConfigurationService.ExposePaths.DeviceAccesses" }]
+ string LUNames[],
+ [IN, Description (
+ "IDs of initiator ports. If existing "
+ "StorageHardwareID instances exist, they MUST be "
+ "used. If no StorageHardwareID instance matches, "
+ "then one is implicitly created. See the method "
+ "description for conditions where this MAY be null." ),
+ ModelCorrespondence { "CIM_StorageHardwareID.StorageID" }]
+ string InitiatorPortIDs[],
+ [IN, Description (
+ "IDs of target ports. See the method description "
+ "for conditions where this MAY be null." ),
+ ModelCorrespondence { "CIM_SCSIProtocolEndpoint.Name" }]
+ string TargetPortIDs[],
+ [IN, Description (
+ "A list of logical unit numbers to assign to the "
+ "corresponding logical unit in the LUNames "
+ "parameter. (within the context of the elements "
+ "specified in the other parameters). If the LUNames "
+ "parameter is null, then this parameter MUST be "
+ "null. Otherwise, if this parameter is null, all LU "
+ "numbers are assigned by the hardware or "
+ "instrumentation." ),
+ ArrayType ( "Indexed" ),
+ ModelCorrespondence {
+ "CIM_ProtocolControllerForUnit.DeviceNumberCIM_ControllerConfigurationService.ExposePaths.LUNames",
+ "CIM_ControllerConfigurationService.ExposePaths.DeviceAccesses" }]
+ string DeviceNumbers[],
+ [IN, Description (
+ "A list of permissions to assign to the "
+ "corresponding logical unit in the LUNames "
+ "parameter. This specifies the permission to assign "
+ "within the context of the elements specified in "
+ "the other parameters. Setting this to \'No Access\' "
+ "assigns the DeviceNumber for the associated "
+ "initiators, but does not grant read or write "
+ "access. If the LUNames parameter is not null then "
+ "this parameter MUST be specified." ),
+ ValueMap { "0", "2", "3", "4", "5..15999", "16000.." },
+ Values { "Unknown", "Read Write", "Read-Only",
+ "No Access", "DMTF Reserved", "Vendor Reserved" },
+ ArrayType ( "Indexed" ),
+ ModelCorrespondence {
+ "CIM_ProtocolControllerForUnit.DeviceAccessCIM_ControllerConfigurationService.ExposePaths.DeviceNumbers",
+ "CIM_ControllerConfigurationService.ExposePaths.LUNames" }]
+ uint16 DeviceAccesses[],
+ [IN, OUT, Description (
+ "An array of references to SCSIProtocolControllers "
+ "(SPCs). On input, this can be null, or contain "
+ "exactly one element; there MAY be multiple "
+ "references on output. If null on input, the "
+ "instrumentation will create one or more new SPC "
+ "instances. If an SPC is specified, the "
+ "instrumentation will attempt to add associations "
+ "to one or more existing SPCs. If the first array "
+ "element is a valid SPC reference and SCSI "
+ "semantics can be preserved, the instrumentation "
+ "MUST attach associations to the specified SPC. If "
+ "multiple elements are non-null on input, the "
+ "instrumentation MUST report an invalid parameter. "
+ "On output, this is an array of references to SPCs "
+ "created or modified as the result of processing "
+ "the request." )]
+ CIM_SCSIProtocolController REF ProtocolControllers[]);
+
+ [Description (
+ "Hide a list of SCSI logical units (such as a RAID volume "
+ "or tape drive) from a list of initiators and/or target "
+ "ports on a SCSIProtocolController (SPC). \n"
+ "\n"
+ "The parameters for this method are: Job - null if no job "
+ "created, otherwise this is a reference to the job. "
+ "LUNames - the list of names of the logical units to use. "
+ "InitiatorPortIDs - the names of the initiator ports to "
+ "use. TargetPortIDs - the names of the target ports to "
+ "use. ProtocolControllers - SPCs involved in this "
+ "operation. \n"
+ "\n"
+ "When hiding logical units, there are three specific use "
+ "cases identified. The instrumentation MUST support these "
+ "use cases. Other permutations are allowed, but are "
+ "vendor-specific. The use cases are: Remove LUs from a "
+ "view, Remove initiator IDs from a view, and Remove "
+ "target port IDs from a view. Remove LUs from a view "
+ "requires that the LUNames parameter not be null and that "
+ "the InitiatorIDs and TargetPortIDs parameters be null. "
+ "Remove initiator IDs from a view requires that the "
+ "LUNames parameter be null, that the InitiatorIDs not be "
+ "null, and that the TargetPortIDs parameters be null. "
+ "Remove target port IDs from a view requires that the "
+ "LUNames and InitiatorPortIDs parameters be null. \n"
+ "\n"
+ "The disposition of the SPC when the last logical unit, "
+ "initiator ID, or target port ID is removed depends upon "
+ "the CIM_ProtocolControllerMaskingCapabilites "
+ "SPCAllowsNo* properties. If SPCAllowsNoLUs is false, "
+ "then the SPC is automatically deleted when the last "
+ "logical unit is removed. If SPCAllowsNoTargets is false, "
+ "then the SPC is automatically deleted when the last "
+ "target port ID is removed. If SPCAllowsNoInitiators is "
+ "false, then the SPC is automatically deleted when the "
+ "last initiator port ID is removed. In all other cases, "
+ "the SPC MUST be explicitly deleted via the "
+ "DeleteInstance intrinsic function." ),
+ ValueMap { "0", "1", "2", "3", "4", "5", "6..4095", "4096",
+ "4097", "4098", "4099", "4100", "4101..32767",
+ "32768..65535" },
+ Values { "Success", "Not Supported", "Unspecified Error",
+ "Timeout", "Failed", "Invalid Parameter", "DMTF Reserved",
+ "Method Parameters Checked - Job Started",
+ "Invalid logical unit ID", "Invalid initiator port ID",
+ "Invalid target port ID",
+ "Target/initiator combination not exposed",
+ "Method Reserved", "Vendor Specific" }]
+ uint32 HidePaths(
+ [IN ( false ), OUT, Description (
+ "Reference to the job if \'Method Parameters "
+ "Checked - Job Started\' is returned (MAY be null "
+ "if job completed)." )]
+ CIM_ConcreteJob REF Job,
+ [Required, IN, Description (
+ "A list of IDs of logical units. Each LU instance "
+ "MUST already exist. See the method description for "
+ "conditions where this MAY be null." ),
+ ModelCorrespondence { "CIM_LogicalDevice.Name" }]
+ string LUNames[],
+ [IN, Description (
+ "IDs of initiator ports. See the method description "
+ "for conditions where this MAY be null." ),
+ ModelCorrespondence { "CIM_StorageHardwareID.StorageID" }]
+ string InitiatorPortIDs[],
+ [IN, Description (
+ "IDs of target ports. See the method description "
+ "for conditions where this MAY be null." ),
+ ModelCorrespondence { "CIM_SCSIProtocolEndpoint.Name" }]
+ string TargetPortIDs[],
+ [IN, OUT, Description (
+ "An array of references to SCSIProtocolControllers "
+ "(SPCs). On input, this MUST contain exactly one "
+ "element; there MAY be multiple references on "
+ "output. The instrumentation will attempt to remove "
+ "associations (LUNames, InitiatorPortIDs, or "
+ "TargetPortIDs) from this SPC. Depending upon the "
+ "specific implementation, the instrumentation MAY "
+ "need to create new SPCs with a subset of the "
+ "remaining associations. On output, this is an "
+ "array of references to SPCs created or modified as "
+ "the result of processing the request." )]
+ CIM_SCSIProtocolController REF ProtocolControllers[]);
+
+};