)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"efcf47fcd1301674fe5ecfabbf1fa797e2c274d8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":28,"id":"b422767c_47215bf9","updated":"2025-08-07 14:45:16.000000000","message":"Sorry for the delay, some comments incoming","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2153c4ce60b7a7092f06409efab0ec5429423e35","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"aa6dc34e_eba9c0e6","updated":"2025-08-13 15:34:41.000000000","message":"LGTM, thanks","commit_id":"4ad524097d497c1ec5b6bfe5cae17ce41e1b3e9b"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"dddbdd1fea126ac3fc16b26cecb514d711a56dc2","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":34,"id":"2eb3ccb2_a6585706","updated":"2025-11-14 16:14:58.000000000","message":"I think this is good. My feedback would be that we probably don\u0027t need another method but could use `def storage(self, expanded: bool \u003d False)` as a change to the method signature.","commit_id":"d6ade3504fbe870e1e171b41546ff70b890e18af"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"acfee1f75f787cd668a8637ef260ed2dcf8fd3a1","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":34,"id":"2235889d_4f50aa2a","in_reply_to":"2eb3ccb2_a6585706","updated":"2025-11-14 18:46:54.000000000","message":"\u003e could use def storage(self, expanded: bool \u003d False) as a change to the method signature.\n\nThese methods are currently defined as properties, so this would be very breaking","commit_id":"d6ade3504fbe870e1e171b41546ff70b890e18af"}],"sushy/main.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3fe1dd292c5abd7fa525e1a5edf00eb9d55e9d1f","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        :returns: The Chassis object"},{"line_number":304,"context_line":"        \"\"\""},{"line_number":305,"context_line":"        if expanded and identity is None:"},{"line_number":306,"context_line":"            raise ValueError(\"identity is required when expanded\u003dTrue\")"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        if expanded:"},{"line_number":309,"context_line":"            identity \u003d f\u0027{identity}{EXPAND_QUERY}\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a054622_b21634de","line":306,"updated":"2025-07-21 14:40:59.000000000","message":"This feels artificial: you get identity on line 319, after that point you can append EXPAND","commit_id":"7293ae9a16afc5d48abd68854b6c6debdc8f20aa"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"1c972e7478ed5dd192a4222aeaf772f5e79a7c6b","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        :returns: The Chassis object"},{"line_number":304,"context_line":"        \"\"\""},{"line_number":305,"context_line":"        if expanded and identity is None:"},{"line_number":306,"context_line":"            raise ValueError(\"identity is required when expanded\u003dTrue\")"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        if expanded:"},{"line_number":309,"context_line":"            identity \u003d f\u0027{identity}{EXPAND_QUERY}\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"cefbdfc3_f83e91be","line":306,"in_reply_to":"3a054622_b21634de","updated":"2025-07-21 15:15:06.000000000","message":"yep.\n\nwas basically passing the identity directly to avoid the \"get_chassis_collection\" API call. taking a look to see if there\u0027s a way around it.","commit_id":"7293ae9a16afc5d48abd68854b6c6debdc8f20aa"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"bd822a56c5cc8a21bb3f928cc0a6aec3698a5963","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        :returns: The Chassis object"},{"line_number":304,"context_line":"        \"\"\""},{"line_number":305,"context_line":"        if expanded and identity is None:"},{"line_number":306,"context_line":"            raise ValueError(\"identity is required when expanded\u003dTrue\")"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        if expanded:"},{"line_number":309,"context_line":"            identity \u003d f\u0027{identity}{EXPAND_QUERY}\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"92021976_cd0bafa0","line":306,"in_reply_to":"cefbdfc3_f83e91be","updated":"2025-07-22 23:41:48.000000000","message":"Updated to pass the identity, avoiding additional calls in this func","commit_id":"7293ae9a16afc5d48abd68854b6c6debdc8f20aa"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3fe1dd292c5abd7fa525e1a5edf00eb9d55e9d1f","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                               redfish_version\u003dself.redfish_version,"},{"line_number":323,"context_line":"                               registries\u003dself.lazy_registries, root\u003dself)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def get_storage_expanded(self, system_path):"},{"line_number":326,"context_line":"        \"\"\"Get storage collection with expanded."},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        This method retrieves storage with all controllers and drives"}],"source_content_type":"text/x-python","patch_set":12,"id":"cf97bc1b_751e9432","line":325,"updated":"2025-07-21 14:40:59.000000000","message":"Consistency: get_storage(expanded\u003dFalse)","commit_id":"7293ae9a16afc5d48abd68854b6c6debdc8f20aa"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"bd822a56c5cc8a21bb3f928cc0a6aec3698a5963","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                               redfish_version\u003dself.redfish_version,"},{"line_number":323,"context_line":"                               registries\u003dself.lazy_registries, root\u003dself)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def get_storage_expanded(self, system_path):"},{"line_number":326,"context_line":"        \"\"\"Get storage collection with expanded."},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        This method retrieves storage with all controllers and drives"}],"source_content_type":"text/x-python","patch_set":12,"id":"b2177e25_7b83e9c0","line":325,"in_reply_to":"cf97bc1b_751e9432","updated":"2025-07-22 23:41:48.000000000","message":"updated","commit_id":"7293ae9a16afc5d48abd68854b6c6debdc8f20aa"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3fe1dd292c5abd7fa525e1a5edf00eb9d55e9d1f","unresolved":false,"context_lines":[{"line_number":332,"context_line":"        :returns: StorageCollection object with expanded drives data"},{"line_number":333,"context_line":"        :raises: Exception if storage expansion fails"},{"line_number":334,"context_line":"        \"\"\""},{"line_number":335,"context_line":"        storage_url \u003d f\u0027{system_path}/Storage{EXPAND_QUERY}\u0027"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"        try:"},{"line_number":338,"context_line":"            return storage.StorageCollection("}],"source_content_type":"text/x-python","patch_set":12,"id":"e65f5c86_579cbca1","line":335,"updated":"2025-07-21 14:40:59.000000000","message":"Unfortunately, there is no guarantee that the URI will looks this way in Redfish. You probably need to move this call to System and use the System object to get the right URI (I wonder if Systems can be expanded too).","commit_id":"7293ae9a16afc5d48abd68854b6c6debdc8f20aa"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"bd822a56c5cc8a21bb3f928cc0a6aec3698a5963","unresolved":false,"context_lines":[{"line_number":332,"context_line":"        :returns: StorageCollection object with expanded drives data"},{"line_number":333,"context_line":"        :raises: Exception if storage expansion fails"},{"line_number":334,"context_line":"        \"\"\""},{"line_number":335,"context_line":"        storage_url \u003d f\u0027{system_path}/Storage{EXPAND_QUERY}\u0027"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"        try:"},{"line_number":338,"context_line":"            return storage.StorageCollection("}],"source_content_type":"text/x-python","patch_set":12,"id":"534c525a_1cef7a89","line":335,"in_reply_to":"d8f15a2a_c0a7087e","updated":"2025-07-22 23:41:48.000000000","message":"Updated so pass the full identity (extracted from systems call)","commit_id":"7293ae9a16afc5d48abd68854b6c6debdc8f20aa"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"1c972e7478ed5dd192a4222aeaf772f5e79a7c6b","unresolved":true,"context_lines":[{"line_number":332,"context_line":"        :returns: StorageCollection object with expanded drives data"},{"line_number":333,"context_line":"        :raises: Exception if storage expansion fails"},{"line_number":334,"context_line":"        \"\"\""},{"line_number":335,"context_line":"        storage_url \u003d f\u0027{system_path}/Storage{EXPAND_QUERY}\u0027"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"        try:"},{"line_number":338,"context_line":"            return storage.StorageCollection("}],"source_content_type":"text/x-python","patch_set":12,"id":"d8f15a2a_c0a7087e","line":335,"in_reply_to":"e65f5c86_579cbca1","updated":"2025-07-21 15:15:06.000000000","message":"yeah we can do Systems with expand and also get the drive URLs there. it was lot larger payload and the parsing was a bit awkward that\u0027s why went Storage expand. Taking a look now...will update it.","commit_id":"7293ae9a16afc5d48abd68854b6c6debdc8f20aa"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"efcf47fcd1301674fe5ecfabbf1fa797e2c274d8","unresolved":true,"context_lines":[{"line_number":316,"context_line":"                               redfish_version\u003dself.redfish_version,"},{"line_number":317,"context_line":"                               registries\u003dself.lazy_registries, root\u003dself)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def get_storage_collection(self, identity\u003dNone, expanded\u003dFalse):"},{"line_number":320,"context_line":"        \"\"\"Given the identity return a StorageCollection object"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        :param identity: The identity of the Storage resource. If not given,"}],"source_content_type":"text/x-python","patch_set":28,"id":"ea2dd254_1257918e","line":319,"updated":"2025-08-07 14:45:16.000000000","message":"I\u0027m looking at your Ironic change, and it seems like you only use these calls after getting the System object anyway, so I\u0027m not sure why it cannot be a method on the System, removing the error-prone part of passing the right identity?","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"0195a60d6e498beb44115807fbe8943f865afcc8","unresolved":false,"context_lines":[{"line_number":316,"context_line":"                               redfish_version\u003dself.redfish_version,"},{"line_number":317,"context_line":"                               registries\u003dself.lazy_registries, root\u003dself)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def get_storage_collection(self, identity\u003dNone, expanded\u003dFalse):"},{"line_number":320,"context_line":"        \"\"\"Given the identity return a StorageCollection object"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        :param identity: The identity of the Storage resource. If not given,"}],"source_content_type":"text/x-python","patch_set":28,"id":"c9c49b13_fcb3848b","line":319,"in_reply_to":"ea2dd254_1257918e","updated":"2025-08-08 17:33:36.000000000","message":"good idea. changed it up to be everything under systems.py and then simply calling functions directly from ironic","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"}],"sushy/resources/base.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"efcf47fcd1301674fe5ecfabbf1fa797e2c274d8","unresolved":true,"context_lines":[{"line_number":690,"context_line":""},{"line_number":691,"context_line":"        if json_doc:"},{"line_number":692,"context_line":"            self._json \u003d json_doc"},{"line_number":693,"context_line":"            data_source \u003d \"expanded_json_doc\""},{"line_number":694,"context_line":"        else:"},{"line_number":695,"context_line":"            self._json \u003d self._reader.get_data().json_doc"},{"line_number":696,"context_line":"            data_source \u003d \"api_call\""}],"source_content_type":"text/x-python","patch_set":28,"id":"6c0749f3_d15c0290","line":693,"updated":"2025-08-07 14:45:16.000000000","message":"This is for humans, right? So maybe make this \"from expanded document\" and let the other data_source be simply empty (so that it looks like before)?","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"c263fdd85fb161277fd3d7add99f2dc30fa31170","unresolved":false,"context_lines":[{"line_number":690,"context_line":""},{"line_number":691,"context_line":"        if json_doc:"},{"line_number":692,"context_line":"            self._json \u003d json_doc"},{"line_number":693,"context_line":"            data_source \u003d \"expanded_json_doc\""},{"line_number":694,"context_line":"        else:"},{"line_number":695,"context_line":"            self._json \u003d self._reader.get_data().json_doc"},{"line_number":696,"context_line":"            data_source \u003d \"api_call\""}],"source_content_type":"text/x-python","patch_set":28,"id":"998129bb_18075ac9","line":693,"in_reply_to":"212b5835_fc5d12cb","updated":"2025-08-13 18:08:12.000000000","message":"Done","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"0195a60d6e498beb44115807fbe8943f865afcc8","unresolved":true,"context_lines":[{"line_number":690,"context_line":""},{"line_number":691,"context_line":"        if json_doc:"},{"line_number":692,"context_line":"            self._json \u003d json_doc"},{"line_number":693,"context_line":"            data_source \u003d \"expanded_json_doc\""},{"line_number":694,"context_line":"        else:"},{"line_number":695,"context_line":"            self._json \u003d self._reader.get_data().json_doc"},{"line_number":696,"context_line":"            data_source \u003d \"api_call\""}],"source_content_type":"text/x-python","patch_set":28,"id":"212b5835_fc5d12cb","line":693,"in_reply_to":"6c0749f3_d15c0290","updated":"2025-08-08 17:33:36.000000000","message":"yeah it was useful for debugging! updated it...but can also remove it if want.","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"}],"sushy/resources/chassis/chassis.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"efcf47fcd1301674fe5ecfabbf1fa797e2c274d8","unresolved":true,"context_lines":[{"line_number":141,"context_line":"    _actions \u003d ActionsField(\u0027Actions\u0027)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    # Optional fields for expanded chassis data"},{"line_number":144,"context_line":"    power_data \u003d base.Field(\u0027Power\u0027, required\u003dFalse)"},{"line_number":145,"context_line":"    \"\"\"Raw power data when chassis is retrieved with $expand\"\"\""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    thermal_data \u003d base.Field(\u0027Thermal\u0027, required\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":28,"id":"b904eede_a3d77920","line":144,"updated":"2025-08-07 14:45:16.000000000","message":"nit: required False is the default","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"0195a60d6e498beb44115807fbe8943f865afcc8","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    _actions \u003d ActionsField(\u0027Actions\u0027)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    # Optional fields for expanded chassis data"},{"line_number":144,"context_line":"    power_data \u003d base.Field(\u0027Power\u0027, required\u003dFalse)"},{"line_number":145,"context_line":"    \"\"\"Raw power data when chassis is retrieved with $expand\"\"\""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    thermal_data \u003d base.Field(\u0027Thermal\u0027, required\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":28,"id":"4f02939b_95b50b01","line":144,"in_reply_to":"b904eede_a3d77920","updated":"2025-08-08 17:33:36.000000000","message":"removed it.","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"acfee1f75f787cd668a8637ef260ed2dcf8fd3a1","unresolved":true,"context_lines":[{"line_number":164,"context_line":"            connector, identity, redfish_version\u003dredfish_version,"},{"line_number":165,"context_line":"            registries\u003dregistries, root\u003droot, json_doc\u003djson_doc)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def _get_expanded_data(self, field_name):"},{"line_number":168,"context_line":"        \"\"\"Get expanded data for a field, returning None if only a reference."},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        :param field_name: Name of the field to get expanded data for"}],"source_content_type":"text/x-python","patch_set":34,"id":"da416752_2dba1107","line":167,"updated":"2025-11-14 18:46:54.000000000","message":"nit: move this to the base class","commit_id":"d6ade3504fbe870e1e171b41546ff70b890e18af"}],"sushy/resources/system/simple_storage.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"efcf47fcd1301674fe5ecfabbf1fa797e2c274d8","unresolved":true,"context_lines":[{"line_number":68,"context_line":"    @utils.cache_it"},{"line_number":69,"context_line":"    def get_members(self):"},{"line_number":70,"context_line":"        \"\"\"Return SimpleStorage objects with expanded JSON data available.\"\"\""},{"line_number":71,"context_line":"        if hasattr(self, \u0027_json\u0027) and self._json and \u0027Members\u0027 in self._json:"},{"line_number":72,"context_line":"            members \u003d []"},{"line_number":73,"context_line":"            for member in self._json[\u0027Members\u0027]:"},{"line_number":74,"context_line":"                # If data only contains a reference (@odata.id),"}],"source_content_type":"text/x-python","patch_set":28,"id":"e0ddb096_58baa94e","line":71,"updated":"2025-08-07 14:45:16.000000000","message":"I\u0027m confused by this check. The _json field is always present in the ResourceBase class, and I\u0027m not sure how it can end up empty. Also Members is always present for collections, so the conditions holds for all but malformed resources?","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"0195a60d6e498beb44115807fbe8943f865afcc8","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    @utils.cache_it"},{"line_number":69,"context_line":"    def get_members(self):"},{"line_number":70,"context_line":"        \"\"\"Return SimpleStorage objects with expanded JSON data available.\"\"\""},{"line_number":71,"context_line":"        if hasattr(self, \u0027_json\u0027) and self._json and \u0027Members\u0027 in self._json:"},{"line_number":72,"context_line":"            members \u003d []"},{"line_number":73,"context_line":"            for member in self._json[\u0027Members\u0027]:"},{"line_number":74,"context_line":"                # If data only contains a reference (@odata.id),"}],"source_content_type":"text/x-python","patch_set":28,"id":"241a29db_db450af1","line":71,"in_reply_to":"e0ddb096_58baa94e","updated":"2025-08-08 17:33:36.000000000","message":"yeah exactly...added during debugging but this is useless and confusing now! removed it now!","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"efcf47fcd1301674fe5ecfabbf1fa797e2c274d8","unresolved":true,"context_lines":[{"line_number":70,"context_line":"        \"\"\"Return SimpleStorage objects with expanded JSON data available.\"\"\""},{"line_number":71,"context_line":"        if hasattr(self, \u0027_json\u0027) and self._json and \u0027Members\u0027 in self._json:"},{"line_number":72,"context_line":"            members \u003d []"},{"line_number":73,"context_line":"            for member in self._json[\u0027Members\u0027]:"},{"line_number":74,"context_line":"                # If data only contains a reference (@odata.id),"},{"line_number":75,"context_line":"                # treat as unexpanded"},{"line_number":76,"context_line":"                if (isinstance(member, dict)"}],"source_content_type":"text/x-python","patch_set":28,"id":"1996c068_a584cac2","line":73,"updated":"2025-08-07 14:45:16.000000000","message":"nit: use self.members_identities","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"0195a60d6e498beb44115807fbe8943f865afcc8","unresolved":true,"context_lines":[{"line_number":70,"context_line":"        \"\"\"Return SimpleStorage objects with expanded JSON data available.\"\"\""},{"line_number":71,"context_line":"        if hasattr(self, \u0027_json\u0027) and self._json and \u0027Members\u0027 in self._json:"},{"line_number":72,"context_line":"            members \u003d []"},{"line_number":73,"context_line":"            for member in self._json[\u0027Members\u0027]:"},{"line_number":74,"context_line":"                # If data only contains a reference (@odata.id),"},{"line_number":75,"context_line":"                # treat as unexpanded"},{"line_number":76,"context_line":"                if (isinstance(member, dict)"}],"source_content_type":"text/x-python","patch_set":28,"id":"d3d293e6_f0296080","line":73,"in_reply_to":"1996c068_a584cac2","updated":"2025-08-08 17:33:36.000000000","message":"Yeah i thinking of using it initially but i needed to full payload to determine if its regular (non-expanded) or expanded. So if non expanded it falls back to the typical flow where it calls `ResourceCollectionBase`\u0027s `self.members_identities`. Wdyt?","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2153c4ce60b7a7092f06409efab0ec5429423e35","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        \"\"\"Return SimpleStorage objects with expanded JSON data available.\"\"\""},{"line_number":71,"context_line":"        if hasattr(self, \u0027_json\u0027) and self._json and \u0027Members\u0027 in self._json:"},{"line_number":72,"context_line":"            members \u003d []"},{"line_number":73,"context_line":"            for member in self._json[\u0027Members\u0027]:"},{"line_number":74,"context_line":"                # If data only contains a reference (@odata.id),"},{"line_number":75,"context_line":"                # treat as unexpanded"},{"line_number":76,"context_line":"                if (isinstance(member, dict)"}],"source_content_type":"text/x-python","patch_set":28,"id":"5777f382_d257e6a4","line":73,"in_reply_to":"d3d293e6_f0296080","updated":"2025-08-13 15:34:41.000000000","message":"Acknowledged","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"}],"sushy/resources/system/storage/storage.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"efcf47fcd1301674fe5ecfabbf1fa797e2c274d8","unresolved":true,"context_lines":[{"line_number":166,"context_line":"    @utils.cache_it"},{"line_number":167,"context_line":"    def get_members(self):"},{"line_number":168,"context_line":"        \"\"\"Return Storage objects with expanded JSON data when available.\"\"\""},{"line_number":169,"context_line":"        if hasattr(self, \u0027_json\u0027) and self._json and \u0027Members\u0027 in self._json:"},{"line_number":170,"context_line":"            storage_members \u003d []"},{"line_number":171,"context_line":"            for member in self._json[\u0027Members\u0027]:"},{"line_number":172,"context_line":"                # If data only contains a reference (@odata.id),"}],"source_content_type":"text/x-python","patch_set":28,"id":"cb05a8f9_006d5d45","line":169,"updated":"2025-08-07 14:45:16.000000000","message":"Same comments here","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"0195a60d6e498beb44115807fbe8943f865afcc8","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    @utils.cache_it"},{"line_number":167,"context_line":"    def get_members(self):"},{"line_number":168,"context_line":"        \"\"\"Return Storage objects with expanded JSON data when available.\"\"\""},{"line_number":169,"context_line":"        if hasattr(self, \u0027_json\u0027) and self._json and \u0027Members\u0027 in self._json:"},{"line_number":170,"context_line":"            storage_members \u003d []"},{"line_number":171,"context_line":"            for member in self._json[\u0027Members\u0027]:"},{"line_number":172,"context_line":"                # If data only contains a reference (@odata.id),"}],"source_content_type":"text/x-python","patch_set":28,"id":"3f722ca6_12a84ecf","line":169,"in_reply_to":"cb05a8f9_006d5d45","updated":"2025-08-08 17:33:36.000000000","message":"removed. not needed!","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"}],"sushy/resources/system/system.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"efcf47fcd1301674fe5ecfabbf1fa797e2c274d8","unresolved":true,"context_lines":[{"line_number":585,"context_line":"            redfish_version\u003dself.redfish_version, registries\u003dself.registries,"},{"line_number":586,"context_line":"            root\u003dself.root)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def get_chassis_links(self):"},{"line_number":589,"context_line":"        \"\"\"Get chassis links without making API calls."},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"        :returns: List of chassis @odata.id links from Links.Chassis"}],"source_content_type":"text/x-python","patch_set":28,"id":"640c7e55_ecd084cc","line":588,"updated":"2025-08-07 14:45:16.000000000","message":"These calls won\u0027t need to be public if you apply my suggestion of moving methods from Sushy here.","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2153c4ce60b7a7092f06409efab0ec5429423e35","unresolved":false,"context_lines":[{"line_number":585,"context_line":"            redfish_version\u003dself.redfish_version, registries\u003dself.registries,"},{"line_number":586,"context_line":"            root\u003dself.root)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def get_chassis_links(self):"},{"line_number":589,"context_line":"        \"\"\"Get chassis links without making API calls."},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"        :returns: List of chassis @odata.id links from Links.Chassis"}],"source_content_type":"text/x-python","patch_set":28,"id":"2b1bab2e_cc7355b5","line":588,"in_reply_to":"500056c6_f116dc50","updated":"2025-08-13 15:34:41.000000000","message":"Acknowledged","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"0195a60d6e498beb44115807fbe8943f865afcc8","unresolved":true,"context_lines":[{"line_number":585,"context_line":"            redfish_version\u003dself.redfish_version, registries\u003dself.registries,"},{"line_number":586,"context_line":"            root\u003dself.root)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def get_chassis_links(self):"},{"line_number":589,"context_line":"        \"\"\"Get chassis links without making API calls."},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"        :returns: List of chassis @odata.id links from Links.Chassis"}],"source_content_type":"text/x-python","patch_set":28,"id":"500056c6_f116dc50","line":588,"in_reply_to":"640c7e55_ecd084cc","updated":"2025-08-08 17:33:36.000000000","message":"All them are removed. And no more changes in the main.py! PTAL","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2153c4ce60b7a7092f06409efab0ec5429423e35","unresolved":true,"context_lines":[{"line_number":484,"context_line":"        \"\"\""},{"line_number":485,"context_line":"        return self.get_simple_storage()"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    def get_simple_storage(self, expanded\u003dFalse):"},{"line_number":488,"context_line":"        \"\"\"Get a collection of simple storage associated with system."},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        :param expanded: If True, retrieve simple storage with devices"}],"source_content_type":"text/x-python","patch_set":30,"id":"5a3a9adc_75b4317c","line":487,"updated":"2025-08-13 15:34:41.000000000","message":"I wonder if you want to move @utils.cache_it here to cache the result across calls.","commit_id":"4ad524097d497c1ec5b6bfe5cae17ce41e1b3e9b"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"c263fdd85fb161277fd3d7add99f2dc30fa31170","unresolved":false,"context_lines":[{"line_number":484,"context_line":"        \"\"\""},{"line_number":485,"context_line":"        return self.get_simple_storage()"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    def get_simple_storage(self, expanded\u003dFalse):"},{"line_number":488,"context_line":"        \"\"\"Get a collection of simple storage associated with system."},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        :param expanded: If True, retrieve simple storage with devices"}],"source_content_type":"text/x-python","patch_set":30,"id":"d8193311_a0876f42","line":487,"in_reply_to":"5a3a9adc_75b4317c","updated":"2025-08-13 18:08:12.000000000","message":"Yeah good call! done","commit_id":"4ad524097d497c1ec5b6bfe5cae17ce41e1b3e9b"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"651f572e6c8a3588ee3ecad823d933100ba84e85","unresolved":false,"context_lines":[{"line_number":484,"context_line":"        \"\"\""},{"line_number":485,"context_line":"        return self.get_simple_storage()"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    def get_simple_storage(self, expanded\u003dFalse):"},{"line_number":488,"context_line":"        \"\"\"Get a collection of simple storage associated with system."},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        :param expanded: If True, retrieve simple storage with devices"}],"source_content_type":"text/x-python","patch_set":30,"id":"f4ccef78_7dee832b","line":487,"in_reply_to":"a8971577_91ee6f49","updated":"2025-10-07 15:10:15.000000000","message":"done","commit_id":"4ad524097d497c1ec5b6bfe5cae17ce41e1b3e9b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"784c63220172c8a534c108c4bb8bcb0bb645b8cf","unresolved":true,"context_lines":[{"line_number":484,"context_line":"        \"\"\""},{"line_number":485,"context_line":"        return self.get_simple_storage()"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    def get_simple_storage(self, expanded\u003dFalse):"},{"line_number":488,"context_line":"        \"\"\"Get a collection of simple storage associated with system."},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        :param expanded: If True, retrieve simple storage with devices"}],"source_content_type":"text/x-python","patch_set":30,"id":"a8971577_91ee6f49","line":487,"in_reply_to":"c2de7031_6f0bae22","updated":"2025-10-03 16:56:05.000000000","message":"It wouldn\u0027t be a bad idea, tbh.  If one has to opt into it, then it might as well be an explicit variation.","commit_id":"4ad524097d497c1ec5b6bfe5cae17ce41e1b3e9b"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"9ca0f2892e68216a69a59ba5a3b9b9e1e72ec0fe","unresolved":true,"context_lines":[{"line_number":484,"context_line":"        \"\"\""},{"line_number":485,"context_line":"        return self.get_simple_storage()"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    def get_simple_storage(self, expanded\u003dFalse):"},{"line_number":488,"context_line":"        \"\"\"Get a collection of simple storage associated with system."},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        :param expanded: If True, retrieve simple storage with devices"}],"source_content_type":"text/x-python","patch_set":30,"id":"c2de7031_6f0bae22","line":487,"in_reply_to":"d8193311_a0876f42","updated":"2025-08-13 19:42:54.000000000","message":"ah...just realized `@utils.cache_it` only works on func without any params (we are doing `expanded true/false`). Should I create two func (one for expanded true and one for false) to satisfy the requirement and decorate them instead?","commit_id":"4ad524097d497c1ec5b6bfe5cae17ce41e1b3e9b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2153c4ce60b7a7092f06409efab0ec5429423e35","unresolved":true,"context_lines":[{"line_number":521,"context_line":"        :returns: `StorageCollection` instance"},{"line_number":522,"context_line":"        \"\"\""},{"line_number":523,"context_line":"        return self.get_storage()"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def get_storage(self, expanded\u003dFalse):"},{"line_number":526,"context_line":"        \"\"\"Get a collection of storage subsystems associated with system."},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"a35b8300_da6ef75a","line":524,"updated":"2025-08-13 15:34:41.000000000","message":"Same","commit_id":"4ad524097d497c1ec5b6bfe5cae17ce41e1b3e9b"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"3d517c89d85471f3d8b1a3e00a9a172587fa7037","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        :returns: `StorageCollection` instance"},{"line_number":522,"context_line":"        \"\"\""},{"line_number":523,"context_line":"        return self.get_storage()"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def get_storage(self, expanded\u003dFalse):"},{"line_number":526,"context_line":"        \"\"\"Get a collection of storage subsystems associated with system."},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"7f50f7f6_58fa468c","line":524,"in_reply_to":"58b0ac27_003bd6b5","updated":"2025-08-13 18:11:06.000000000","message":"also did the same get_chassis","commit_id":"4ad524097d497c1ec5b6bfe5cae17ce41e1b3e9b"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"c263fdd85fb161277fd3d7add99f2dc30fa31170","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        :returns: `StorageCollection` instance"},{"line_number":522,"context_line":"        \"\"\""},{"line_number":523,"context_line":"        return self.get_storage()"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def get_storage(self, expanded\u003dFalse):"},{"line_number":526,"context_line":"        \"\"\"Get a collection of storage subsystems associated with system."},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"58b0ac27_003bd6b5","line":524,"in_reply_to":"a35b8300_da6ef75a","updated":"2025-08-13 18:08:12.000000000","message":"done","commit_id":"4ad524097d497c1ec5b6bfe5cae17ce41e1b3e9b"}],"sushy/tests/unit/resources/system/storage/test_storage.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"efcf47fcd1301674fe5ecfabbf1fa797e2c274d8","unresolved":true,"context_lines":[{"line_number":423,"context_line":"    def test_get_members_expanded(self):"},{"line_number":424,"context_line":"        # Test with expanded JSON data containing full member objects"},{"line_number":425,"context_line":"        # This simulates a response from ?$expand\u003d.($levels\u003d1)"},{"line_number":426,"context_line":"        expanded_json \u003d {"},{"line_number":427,"context_line":"            \"@odata.type\": \"#StorageCollection.StorageCollection\","},{"line_number":428,"context_line":"            \"@odata.id\": \"/redfish/v1/Systems/1/Storage\","},{"line_number":429,"context_line":"            \"Name\": \"Storage Collection\","}],"source_content_type":"text/x-python","patch_set":28,"id":"e7dd6e38_e7b41d65","line":426,"updated":"2025-08-07 14:45:16.000000000","message":"We tend to keep sample data as JSON files in the tree - see other tests","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"0195a60d6e498beb44115807fbe8943f865afcc8","unresolved":false,"context_lines":[{"line_number":423,"context_line":"    def test_get_members_expanded(self):"},{"line_number":424,"context_line":"        # Test with expanded JSON data containing full member objects"},{"line_number":425,"context_line":"        # This simulates a response from ?$expand\u003d.($levels\u003d1)"},{"line_number":426,"context_line":"        expanded_json \u003d {"},{"line_number":427,"context_line":"            \"@odata.type\": \"#StorageCollection.StorageCollection\","},{"line_number":428,"context_line":"            \"@odata.id\": \"/redfish/v1/Systems/1/Storage\","},{"line_number":429,"context_line":"            \"Name\": \"Storage Collection\","}],"source_content_type":"text/x-python","patch_set":28,"id":"a76d5b26_47fd1a62","line":426,"in_reply_to":"e7dd6e38_e7b41d65","updated":"2025-08-08 17:33:36.000000000","message":"updated","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"}],"sushy/tests/unit/resources/system/test_simple_storage.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"efcf47fcd1301674fe5ecfabbf1fa797e2c274d8","unresolved":true,"context_lines":[{"line_number":145,"context_line":"    def test_get_members_expanded(self):"},{"line_number":146,"context_line":"        # Test with expanded JSON data containing full member objects"},{"line_number":147,"context_line":"        # This simulates a response from ?$expand\u003d.($levels\u003d1)"},{"line_number":148,"context_line":"        expanded_json \u003d {"},{"line_number":149,"context_line":"            \"@odata.type\": \"#SimpleStorageCollection.SimpleStorageCollection\","},{"line_number":150,"context_line":"            \"@odata.id\": \"/redfish/v1/Systems/1/SimpleStorage\","},{"line_number":151,"context_line":"            \"Name\": \"Simple Storage Collection\","}],"source_content_type":"text/x-python","patch_set":28,"id":"399122ad_34daae33","line":148,"updated":"2025-08-07 14:45:16.000000000","message":"same here","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"5ccaf0d211d5ea8b52afb1e1ba589cac993fdab9","unresolved":false,"context_lines":[{"line_number":145,"context_line":"    def test_get_members_expanded(self):"},{"line_number":146,"context_line":"        # Test with expanded JSON data containing full member objects"},{"line_number":147,"context_line":"        # This simulates a response from ?$expand\u003d.($levels\u003d1)"},{"line_number":148,"context_line":"        expanded_json \u003d {"},{"line_number":149,"context_line":"            \"@odata.type\": \"#SimpleStorageCollection.SimpleStorageCollection\","},{"line_number":150,"context_line":"            \"@odata.id\": \"/redfish/v1/Systems/1/SimpleStorage\","},{"line_number":151,"context_line":"            \"Name\": \"Simple Storage Collection\","}],"source_content_type":"text/x-python","patch_set":28,"id":"bda6b3c8_5f82c1bc","line":148,"in_reply_to":"399122ad_34daae33","updated":"2025-08-08 17:54:21.000000000","message":"Done","commit_id":"3424ea95639f3213b91955db44185cfc310e2d55"}]}
