regscale-cli 6.21.2.0__py3-none-any.whl → 6.28.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. regscale/_version.py +1 -1
  2. regscale/airflow/hierarchy.py +2 -2
  3. regscale/core/app/api.py +5 -2
  4. regscale/core/app/application.py +36 -6
  5. regscale/core/app/internal/control_editor.py +73 -21
  6. regscale/core/app/internal/evidence.py +727 -204
  7. regscale/core/app/internal/login.py +4 -2
  8. regscale/core/app/internal/model_editor.py +219 -64
  9. regscale/core/app/utils/app_utils.py +86 -12
  10. regscale/core/app/utils/catalog_utils/common.py +1 -1
  11. regscale/core/login.py +21 -4
  12. regscale/core/utils/async_graphql_client.py +363 -0
  13. regscale/core/utils/date.py +77 -1
  14. regscale/dev/cli.py +26 -0
  15. regscale/dev/code_gen.py +109 -24
  16. regscale/dev/version.py +72 -0
  17. regscale/integrations/commercial/__init__.py +30 -2
  18. regscale/integrations/commercial/aws/audit_manager_compliance.py +3908 -0
  19. regscale/integrations/commercial/aws/cli.py +3107 -54
  20. regscale/integrations/commercial/aws/cloudtrail_control_mappings.py +333 -0
  21. regscale/integrations/commercial/aws/cloudtrail_evidence.py +501 -0
  22. regscale/integrations/commercial/aws/cloudwatch_control_mappings.py +357 -0
  23. regscale/integrations/commercial/aws/cloudwatch_evidence.py +490 -0
  24. regscale/integrations/commercial/{amazon → aws}/common.py +71 -19
  25. regscale/integrations/commercial/aws/config_compliance.py +914 -0
  26. regscale/integrations/commercial/aws/conformance_pack_mappings.py +198 -0
  27. regscale/integrations/commercial/aws/control_compliance_analyzer.py +439 -0
  28. regscale/integrations/commercial/aws/evidence_generator.py +283 -0
  29. regscale/integrations/commercial/aws/guardduty_control_mappings.py +340 -0
  30. regscale/integrations/commercial/aws/guardduty_evidence.py +1053 -0
  31. regscale/integrations/commercial/aws/iam_control_mappings.py +368 -0
  32. regscale/integrations/commercial/aws/iam_evidence.py +574 -0
  33. regscale/integrations/commercial/aws/inventory/__init__.py +338 -22
  34. regscale/integrations/commercial/aws/inventory/base.py +107 -5
  35. regscale/integrations/commercial/aws/inventory/resources/analytics.py +390 -0
  36. regscale/integrations/commercial/aws/inventory/resources/applications.py +234 -0
  37. regscale/integrations/commercial/aws/inventory/resources/audit_manager.py +513 -0
  38. regscale/integrations/commercial/aws/inventory/resources/cloudtrail.py +315 -0
  39. regscale/integrations/commercial/aws/inventory/resources/cloudtrail_logs_metadata.py +476 -0
  40. regscale/integrations/commercial/aws/inventory/resources/cloudwatch.py +191 -0
  41. regscale/integrations/commercial/aws/inventory/resources/compute.py +328 -9
  42. regscale/integrations/commercial/aws/inventory/resources/config.py +464 -0
  43. regscale/integrations/commercial/aws/inventory/resources/containers.py +74 -9
  44. regscale/integrations/commercial/aws/inventory/resources/database.py +481 -31
  45. regscale/integrations/commercial/aws/inventory/resources/developer_tools.py +253 -0
  46. regscale/integrations/commercial/aws/inventory/resources/guardduty.py +286 -0
  47. regscale/integrations/commercial/aws/inventory/resources/iam.py +470 -0
  48. regscale/integrations/commercial/aws/inventory/resources/inspector.py +476 -0
  49. regscale/integrations/commercial/aws/inventory/resources/integration.py +175 -61
  50. regscale/integrations/commercial/aws/inventory/resources/kms.py +447 -0
  51. regscale/integrations/commercial/aws/inventory/resources/machine_learning.py +358 -0
  52. regscale/integrations/commercial/aws/inventory/resources/networking.py +390 -67
  53. regscale/integrations/commercial/aws/inventory/resources/s3.py +394 -0
  54. regscale/integrations/commercial/aws/inventory/resources/security.py +268 -72
  55. regscale/integrations/commercial/aws/inventory/resources/securityhub.py +473 -0
  56. regscale/integrations/commercial/aws/inventory/resources/storage.py +288 -29
  57. regscale/integrations/commercial/aws/inventory/resources/systems_manager.py +657 -0
  58. regscale/integrations/commercial/aws/inventory/resources/vpc.py +655 -0
  59. regscale/integrations/commercial/aws/kms_control_mappings.py +288 -0
  60. regscale/integrations/commercial/aws/kms_evidence.py +879 -0
  61. regscale/integrations/commercial/aws/ocsf/__init__.py +7 -0
  62. regscale/integrations/commercial/aws/ocsf/constants.py +115 -0
  63. regscale/integrations/commercial/aws/ocsf/mapper.py +435 -0
  64. regscale/integrations/commercial/aws/org_control_mappings.py +286 -0
  65. regscale/integrations/commercial/aws/org_evidence.py +666 -0
  66. regscale/integrations/commercial/aws/s3_control_mappings.py +356 -0
  67. regscale/integrations/commercial/aws/s3_evidence.py +632 -0
  68. regscale/integrations/commercial/aws/scanner.py +1072 -205
  69. regscale/integrations/commercial/aws/security_hub.py +319 -0
  70. regscale/integrations/commercial/aws/session_manager.py +282 -0
  71. regscale/integrations/commercial/aws/ssm_control_mappings.py +291 -0
  72. regscale/integrations/commercial/aws/ssm_evidence.py +492 -0
  73. regscale/integrations/commercial/jira.py +489 -153
  74. regscale/integrations/commercial/microsoft_defender/defender.py +326 -5
  75. regscale/integrations/commercial/microsoft_defender/defender_api.py +348 -14
  76. regscale/integrations/commercial/microsoft_defender/defender_constants.py +157 -0
  77. regscale/integrations/commercial/qualys/__init__.py +167 -68
  78. regscale/integrations/commercial/qualys/scanner.py +305 -39
  79. regscale/integrations/commercial/sarif/sairf_importer.py +432 -0
  80. regscale/integrations/commercial/sarif/sarif_converter.py +67 -0
  81. regscale/integrations/commercial/sicura/api.py +79 -42
  82. regscale/integrations/commercial/sicura/commands.py +8 -2
  83. regscale/integrations/commercial/sicura/scanner.py +83 -44
  84. regscale/integrations/commercial/stigv2/ckl_parser.py +5 -5
  85. regscale/integrations/commercial/synqly/assets.py +133 -16
  86. regscale/integrations/commercial/synqly/edr.py +2 -8
  87. regscale/integrations/commercial/synqly/query_builder.py +536 -0
  88. regscale/integrations/commercial/synqly/ticketing.py +27 -0
  89. regscale/integrations/commercial/synqly/vulnerabilities.py +165 -28
  90. regscale/integrations/commercial/tenablev2/cis_parsers.py +453 -0
  91. regscale/integrations/commercial/tenablev2/cis_scanner.py +447 -0
  92. regscale/integrations/commercial/tenablev2/commands.py +146 -5
  93. regscale/integrations/commercial/tenablev2/scanner.py +1 -3
  94. regscale/integrations/commercial/tenablev2/stig_parsers.py +113 -57
  95. regscale/integrations/commercial/wizv2/WizDataMixin.py +1 -1
  96. regscale/integrations/commercial/wizv2/click.py +191 -76
  97. regscale/integrations/commercial/wizv2/compliance/__init__.py +15 -0
  98. regscale/integrations/commercial/wizv2/{policy_compliance_helpers.py → compliance/helpers.py} +78 -60
  99. regscale/integrations/commercial/wizv2/compliance_report.py +1592 -0
  100. regscale/integrations/commercial/wizv2/core/__init__.py +133 -0
  101. regscale/integrations/commercial/wizv2/{async_client.py → core/client.py} +7 -3
  102. regscale/integrations/commercial/wizv2/{constants.py → core/constants.py} +92 -89
  103. regscale/integrations/commercial/wizv2/core/file_operations.py +237 -0
  104. regscale/integrations/commercial/wizv2/fetchers/__init__.py +11 -0
  105. regscale/integrations/commercial/wizv2/{data_fetcher.py → fetchers/policy_assessment.py} +66 -9
  106. regscale/integrations/commercial/wizv2/file_cleanup.py +104 -0
  107. regscale/integrations/commercial/wizv2/issue.py +776 -28
  108. regscale/integrations/commercial/wizv2/models/__init__.py +0 -0
  109. regscale/integrations/commercial/wizv2/parsers/__init__.py +34 -0
  110. regscale/integrations/commercial/wizv2/{parsers.py → parsers/main.py} +1 -1
  111. regscale/integrations/commercial/wizv2/processors/__init__.py +11 -0
  112. regscale/integrations/commercial/wizv2/{finding_processor.py → processors/finding.py} +1 -1
  113. regscale/integrations/commercial/wizv2/reports.py +243 -0
  114. regscale/integrations/commercial/wizv2/sbom.py +1 -1
  115. regscale/integrations/commercial/wizv2/scanner.py +1031 -441
  116. regscale/integrations/commercial/wizv2/utils/__init__.py +48 -0
  117. regscale/integrations/commercial/wizv2/{utils.py → utils/main.py} +116 -61
  118. regscale/integrations/commercial/wizv2/variables.py +89 -3
  119. regscale/integrations/compliance_integration.py +1036 -151
  120. regscale/integrations/control_matcher.py +432 -0
  121. regscale/integrations/due_date_handler.py +333 -0
  122. regscale/integrations/milestone_manager.py +291 -0
  123. regscale/integrations/public/__init__.py +14 -0
  124. regscale/integrations/public/cci_importer.py +834 -0
  125. regscale/integrations/public/csam/__init__.py +0 -0
  126. regscale/integrations/public/csam/csam.py +938 -0
  127. regscale/integrations/public/csam/csam_agency_defined.py +179 -0
  128. regscale/integrations/public/csam/csam_common.py +154 -0
  129. regscale/integrations/public/csam/csam_controls.py +432 -0
  130. regscale/integrations/public/csam/csam_poam.py +124 -0
  131. regscale/integrations/public/fedramp/click.py +77 -6
  132. regscale/integrations/public/fedramp/docx_parser.py +10 -1
  133. regscale/integrations/public/fedramp/fedramp_cis_crm.py +675 -289
  134. regscale/integrations/public/fedramp/fedramp_five.py +1 -1
  135. regscale/integrations/public/fedramp/poam/scanner.py +75 -7
  136. regscale/integrations/public/fedramp/poam_export_v5.py +888 -0
  137. regscale/integrations/scanner_integration.py +1961 -430
  138. regscale/models/integration_models/CCI_List.xml +1 -0
  139. regscale/models/integration_models/aqua.py +2 -2
  140. regscale/models/integration_models/cisa_kev_data.json +805 -11
  141. regscale/models/integration_models/flat_file_importer/__init__.py +5 -8
  142. regscale/models/integration_models/nexpose.py +36 -10
  143. regscale/models/integration_models/qualys.py +3 -4
  144. regscale/models/integration_models/synqly_models/capabilities.json +1 -1
  145. regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +87 -18
  146. regscale/models/integration_models/synqly_models/filter_parser.py +332 -0
  147. regscale/models/integration_models/synqly_models/ocsf_mapper.py +124 -25
  148. regscale/models/integration_models/synqly_models/synqly_model.py +89 -16
  149. regscale/models/locking.py +12 -8
  150. regscale/models/platform.py +4 -2
  151. regscale/models/regscale_models/__init__.py +7 -0
  152. regscale/models/regscale_models/assessment.py +2 -1
  153. regscale/models/regscale_models/catalog.py +1 -1
  154. regscale/models/regscale_models/compliance_settings.py +251 -1
  155. regscale/models/regscale_models/component.py +1 -0
  156. regscale/models/regscale_models/control_implementation.py +236 -41
  157. regscale/models/regscale_models/control_objective.py +74 -5
  158. regscale/models/regscale_models/file.py +2 -0
  159. regscale/models/regscale_models/form_field_value.py +5 -3
  160. regscale/models/regscale_models/inheritance.py +44 -0
  161. regscale/models/regscale_models/issue.py +301 -102
  162. regscale/models/regscale_models/milestone.py +33 -14
  163. regscale/models/regscale_models/organization.py +3 -0
  164. regscale/models/regscale_models/regscale_model.py +310 -73
  165. regscale/models/regscale_models/security_plan.py +4 -2
  166. regscale/models/regscale_models/vulnerability.py +3 -3
  167. regscale/regscale.py +25 -4
  168. regscale/templates/__init__.py +0 -0
  169. regscale/utils/threading/threadhandler.py +20 -15
  170. regscale/validation/record.py +23 -1
  171. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/METADATA +17 -33
  172. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/RECORD +310 -111
  173. tests/core/__init__.py +0 -0
  174. tests/core/utils/__init__.py +0 -0
  175. tests/core/utils/test_async_graphql_client.py +472 -0
  176. tests/fixtures/test_fixture.py +13 -8
  177. tests/regscale/core/test_login.py +171 -4
  178. tests/regscale/integrations/commercial/__init__.py +0 -0
  179. tests/regscale/integrations/commercial/aws/__init__.py +0 -0
  180. tests/regscale/integrations/commercial/aws/test_audit_manager_compliance.py +1304 -0
  181. tests/regscale/integrations/commercial/aws/test_audit_manager_evidence_aggregation.py +341 -0
  182. tests/regscale/integrations/commercial/aws/test_aws_analytics_collector.py +260 -0
  183. tests/regscale/integrations/commercial/aws/test_aws_applications_collector.py +242 -0
  184. tests/regscale/integrations/commercial/aws/test_aws_audit_manager_collector.py +1155 -0
  185. tests/regscale/integrations/commercial/aws/test_aws_cloudtrail_collector.py +534 -0
  186. tests/regscale/integrations/commercial/aws/test_aws_config_collector.py +400 -0
  187. tests/regscale/integrations/commercial/aws/test_aws_developer_tools_collector.py +203 -0
  188. tests/regscale/integrations/commercial/aws/test_aws_guardduty_collector.py +315 -0
  189. tests/regscale/integrations/commercial/aws/test_aws_iam_collector.py +458 -0
  190. tests/regscale/integrations/commercial/aws/test_aws_inspector_collector.py +353 -0
  191. tests/regscale/integrations/commercial/aws/test_aws_inventory_integration.py +530 -0
  192. tests/regscale/integrations/commercial/aws/test_aws_kms_collector.py +919 -0
  193. tests/regscale/integrations/commercial/aws/test_aws_machine_learning_collector.py +237 -0
  194. tests/regscale/integrations/commercial/aws/test_aws_s3_collector.py +722 -0
  195. tests/regscale/integrations/commercial/aws/test_aws_scanner_integration.py +722 -0
  196. tests/regscale/integrations/commercial/aws/test_aws_securityhub_collector.py +792 -0
  197. tests/regscale/integrations/commercial/aws/test_aws_systems_manager_collector.py +918 -0
  198. tests/regscale/integrations/commercial/aws/test_aws_vpc_collector.py +996 -0
  199. tests/regscale/integrations/commercial/aws/test_cli_evidence.py +431 -0
  200. tests/regscale/integrations/commercial/aws/test_cloudtrail_control_mappings.py +452 -0
  201. tests/regscale/integrations/commercial/aws/test_cloudtrail_evidence.py +788 -0
  202. tests/regscale/integrations/commercial/aws/test_config_compliance.py +298 -0
  203. tests/regscale/integrations/commercial/aws/test_conformance_pack_mappings.py +200 -0
  204. tests/regscale/integrations/commercial/aws/test_control_compliance_analyzer.py +375 -0
  205. tests/regscale/integrations/commercial/aws/test_datetime_parsing.py +223 -0
  206. tests/regscale/integrations/commercial/aws/test_evidence_generator.py +386 -0
  207. tests/regscale/integrations/commercial/aws/test_guardduty_control_mappings.py +564 -0
  208. tests/regscale/integrations/commercial/aws/test_guardduty_evidence.py +1041 -0
  209. tests/regscale/integrations/commercial/aws/test_iam_control_mappings.py +718 -0
  210. tests/regscale/integrations/commercial/aws/test_iam_evidence.py +1375 -0
  211. tests/regscale/integrations/commercial/aws/test_kms_control_mappings.py +656 -0
  212. tests/regscale/integrations/commercial/aws/test_kms_evidence.py +1163 -0
  213. tests/regscale/integrations/commercial/aws/test_ocsf_mapper.py +370 -0
  214. tests/regscale/integrations/commercial/aws/test_org_control_mappings.py +546 -0
  215. tests/regscale/integrations/commercial/aws/test_org_evidence.py +1240 -0
  216. tests/regscale/integrations/commercial/aws/test_s3_control_mappings.py +672 -0
  217. tests/regscale/integrations/commercial/aws/test_s3_evidence.py +987 -0
  218. tests/regscale/integrations/commercial/aws/test_scanner_evidence.py +373 -0
  219. tests/regscale/integrations/commercial/aws/test_security_hub_config_filtering.py +539 -0
  220. tests/regscale/integrations/commercial/aws/test_session_manager.py +516 -0
  221. tests/regscale/integrations/commercial/aws/test_ssm_control_mappings.py +588 -0
  222. tests/regscale/integrations/commercial/aws/test_ssm_evidence.py +735 -0
  223. tests/regscale/integrations/commercial/conftest.py +28 -0
  224. tests/regscale/integrations/commercial/microsoft_defender/__init__.py +1 -0
  225. tests/regscale/integrations/commercial/microsoft_defender/test_defender.py +1517 -0
  226. tests/regscale/integrations/commercial/microsoft_defender/test_defender_api.py +1748 -0
  227. tests/regscale/integrations/commercial/microsoft_defender/test_defender_constants.py +327 -0
  228. tests/regscale/integrations/commercial/microsoft_defender/test_defender_scanner.py +487 -0
  229. tests/regscale/integrations/commercial/test_aws.py +3742 -0
  230. tests/regscale/integrations/commercial/test_burp.py +48 -0
  231. tests/regscale/integrations/commercial/test_crowdstrike.py +49 -0
  232. tests/regscale/integrations/commercial/test_dependabot.py +341 -0
  233. tests/regscale/integrations/commercial/test_gcp.py +1543 -0
  234. tests/regscale/integrations/commercial/test_gitlab.py +549 -0
  235. tests/regscale/integrations/commercial/test_ip_mac_address_length.py +84 -0
  236. tests/regscale/integrations/commercial/test_jira.py +2204 -0
  237. tests/regscale/integrations/commercial/test_npm_audit.py +42 -0
  238. tests/regscale/integrations/commercial/test_okta.py +1228 -0
  239. tests/regscale/integrations/commercial/test_sarif_converter.py +251 -0
  240. tests/regscale/integrations/commercial/test_sicura.py +349 -0
  241. tests/regscale/integrations/commercial/test_snow.py +423 -0
  242. tests/regscale/integrations/commercial/test_sonarcloud.py +394 -0
  243. tests/regscale/integrations/commercial/test_sqlserver.py +186 -0
  244. tests/regscale/integrations/commercial/test_stig.py +33 -0
  245. tests/regscale/integrations/commercial/test_stig_mapper.py +153 -0
  246. tests/regscale/integrations/commercial/test_stigv2.py +406 -0
  247. tests/regscale/integrations/commercial/test_wiz.py +1365 -0
  248. tests/regscale/integrations/commercial/test_wiz_inventory.py +256 -0
  249. tests/regscale/integrations/commercial/wizv2/__init__.py +339 -0
  250. tests/regscale/integrations/commercial/wizv2/compliance/__init__.py +1 -0
  251. tests/regscale/integrations/commercial/wizv2/compliance/test_helpers.py +903 -0
  252. tests/regscale/integrations/commercial/wizv2/core/__init__.py +1 -0
  253. tests/regscale/integrations/commercial/wizv2/core/test_auth.py +701 -0
  254. tests/regscale/integrations/commercial/wizv2/core/test_client.py +1037 -0
  255. tests/regscale/integrations/commercial/wizv2/core/test_file_operations.py +989 -0
  256. tests/regscale/integrations/commercial/wizv2/fetchers/__init__.py +1 -0
  257. tests/regscale/integrations/commercial/wizv2/fetchers/test_policy_assessment.py +805 -0
  258. tests/regscale/integrations/commercial/wizv2/parsers/__init__.py +1 -0
  259. tests/regscale/integrations/commercial/wizv2/parsers/test_main.py +1153 -0
  260. tests/regscale/integrations/commercial/wizv2/processors/__init__.py +1 -0
  261. tests/regscale/integrations/commercial/wizv2/processors/test_finding.py +671 -0
  262. tests/regscale/integrations/commercial/wizv2/test_WizDataMixin.py +537 -0
  263. tests/regscale/integrations/commercial/wizv2/test_click_comprehensive.py +851 -0
  264. tests/regscale/integrations/commercial/wizv2/test_compliance_report_comprehensive.py +910 -0
  265. tests/regscale/integrations/commercial/wizv2/test_compliance_report_normalization.py +138 -0
  266. tests/regscale/integrations/commercial/wizv2/test_file_cleanup.py +283 -0
  267. tests/regscale/integrations/commercial/wizv2/test_file_operations.py +260 -0
  268. tests/regscale/integrations/commercial/wizv2/test_issue.py +343 -0
  269. tests/regscale/integrations/commercial/wizv2/test_issue_comprehensive.py +1203 -0
  270. tests/regscale/integrations/commercial/wizv2/test_reports.py +497 -0
  271. tests/regscale/integrations/commercial/wizv2/test_sbom.py +643 -0
  272. tests/regscale/integrations/commercial/wizv2/test_scanner_comprehensive.py +805 -0
  273. tests/regscale/integrations/commercial/wizv2/test_wiz_click_client_id.py +165 -0
  274. tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_report.py +1394 -0
  275. tests/regscale/integrations/commercial/wizv2/test_wiz_compliance_unit.py +341 -0
  276. tests/regscale/integrations/commercial/wizv2/test_wiz_control_normalization.py +138 -0
  277. tests/regscale/integrations/commercial/wizv2/test_wiz_findings_comprehensive.py +364 -0
  278. tests/regscale/integrations/commercial/wizv2/test_wiz_inventory_comprehensive.py +644 -0
  279. tests/regscale/integrations/commercial/wizv2/test_wiz_status_mapping.py +149 -0
  280. tests/regscale/integrations/commercial/wizv2/test_wizv2.py +1218 -0
  281. tests/regscale/integrations/commercial/wizv2/test_wizv2_utils.py +519 -0
  282. tests/regscale/integrations/commercial/wizv2/utils/__init__.py +1 -0
  283. tests/regscale/integrations/commercial/wizv2/utils/test_main.py +1523 -0
  284. tests/regscale/integrations/public/__init__.py +0 -0
  285. tests/regscale/integrations/public/fedramp/__init__.py +1 -0
  286. tests/regscale/integrations/public/fedramp/test_gen_asset_list.py +150 -0
  287. tests/regscale/integrations/public/fedramp/test_poam_export_v5.py +1293 -0
  288. tests/regscale/integrations/public/test_alienvault.py +220 -0
  289. tests/regscale/integrations/public/test_cci.py +1053 -0
  290. tests/regscale/integrations/public/test_cisa.py +1021 -0
  291. tests/regscale/integrations/public/test_emass.py +518 -0
  292. tests/regscale/integrations/public/test_fedramp.py +1152 -0
  293. tests/regscale/integrations/public/test_fedramp_cis_crm.py +3661 -0
  294. tests/regscale/integrations/public/test_file_uploads.py +506 -0
  295. tests/regscale/integrations/public/test_oscal.py +453 -0
  296. tests/regscale/integrations/test_compliance_status_mapping.py +406 -0
  297. tests/regscale/integrations/test_control_matcher.py +1421 -0
  298. tests/regscale/integrations/test_control_matching.py +155 -0
  299. tests/regscale/integrations/test_milestone_manager.py +408 -0
  300. tests/regscale/models/test_control_implementation.py +118 -3
  301. tests/regscale/models/test_form_field_value_integration.py +304 -0
  302. tests/regscale/models/test_issue.py +378 -1
  303. tests/regscale/models/test_module_integration.py +582 -0
  304. tests/regscale/models/test_tenable_integrations.py +811 -105
  305. regscale/integrations/commercial/wizv2/policy_compliance.py +0 -3057
  306. regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +0 -7388
  307. regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +0 -9605
  308. regscale/integrations/public/fedramp/parts_mapper.py +0 -107
  309. /regscale/integrations/commercial/{amazon → sarif}/__init__.py +0 -0
  310. /regscale/integrations/commercial/wizv2/{wiz_auth.py → core/auth.py} +0 -0
  311. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/LICENSE +0 -0
  312. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/WHEEL +0 -0
  313. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/entry_points.txt +0 -0
  314. {regscale_cli-6.21.2.0.dist-info → regscale_cli-6.28.2.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,358 @@
1
+ """AWS machine learning resource collectors."""
2
+
3
+ import logging
4
+ from typing import Dict, List, Any, Optional
5
+
6
+ from ..base import BaseCollector
7
+
8
+ logger = logging.getLogger("regscale")
9
+
10
+
11
+ class MachineLearningCollector(BaseCollector):
12
+ """Collector for AWS machine learning resources with filtering support."""
13
+
14
+ def __init__(
15
+ self,
16
+ session: Any,
17
+ region: str,
18
+ account_id: Optional[str] = None,
19
+ tags: Optional[Dict[str, str]] = None,
20
+ enabled_services: Optional[Dict[str, bool]] = None,
21
+ ):
22
+ """
23
+ Initialize machine learning collector with filtering support.
24
+
25
+ :param session: AWS session to use for API calls
26
+ :param str region: AWS region to collect from
27
+ :param str account_id: Optional AWS account ID to filter resources
28
+ :param dict tags: Optional tag filters (AND logic)
29
+ :param dict enabled_services: Optional dict of service names to boolean flags for enabling/disabling collection
30
+ """
31
+ super().__init__(session, region, account_id, tags)
32
+ self.enabled_services = enabled_services or {}
33
+
34
+ def get_sagemaker_endpoints(self) -> List[Dict[str, Any]]:
35
+ """
36
+ Get information about SageMaker inference endpoints.
37
+
38
+ :return: List of SageMaker endpoint information
39
+ :rtype: List[Dict[str, Any]]
40
+ """
41
+ endpoints = []
42
+ try:
43
+ sagemaker_client = self._get_client("sagemaker")
44
+ paginator = sagemaker_client.get_paginator("list_endpoints")
45
+
46
+ for page in paginator.paginate():
47
+ for endpoint_summary in page.get("Endpoints", []):
48
+ endpoint_name = endpoint_summary.get("EndpointName")
49
+
50
+ try:
51
+ endpoint_detail = sagemaker_client.describe_endpoint(EndpointName=endpoint_name)
52
+ endpoint_arn = endpoint_detail.get("EndpointArn", "")
53
+
54
+ if not self._matches_account(endpoint_arn):
55
+ continue
56
+
57
+ tags_response = sagemaker_client.list_tags(ResourceArn=endpoint_arn)
58
+ endpoint_tags = tags_response.get("Tags", [])
59
+
60
+ if not self._matches_tags(endpoint_tags):
61
+ continue
62
+
63
+ endpoints.append(
64
+ {
65
+ "Region": self.region,
66
+ "EndpointName": endpoint_name,
67
+ "EndpointArn": endpoint_arn,
68
+ "EndpointStatus": endpoint_detail.get("EndpointStatus"),
69
+ "EndpointConfigName": endpoint_detail.get("EndpointConfigName"),
70
+ "CreationTime": endpoint_detail.get("CreationTime"),
71
+ "LastModifiedTime": endpoint_detail.get("LastModifiedTime"),
72
+ "Tags": endpoint_tags,
73
+ }
74
+ )
75
+ except Exception as endpoint_error:
76
+ logger.debug(
77
+ "Error getting SageMaker endpoint details for %s: %s", endpoint_name, endpoint_error
78
+ )
79
+ continue
80
+
81
+ except Exception as e:
82
+ self._handle_error(e, "SageMaker endpoints")
83
+ return endpoints
84
+
85
+ def get_sagemaker_models(self) -> List[Dict[str, Any]]:
86
+ """
87
+ Get information about SageMaker models.
88
+
89
+ :return: List of SageMaker model information
90
+ :rtype: List[Dict[str, Any]]
91
+ """
92
+ models = []
93
+ try:
94
+ sagemaker_client = self._get_client("sagemaker")
95
+ paginator = sagemaker_client.get_paginator("list_models")
96
+
97
+ for page in paginator.paginate():
98
+ for model_summary in page.get("Models", []):
99
+ model_name = model_summary.get("ModelName")
100
+
101
+ try:
102
+ model_detail = sagemaker_client.describe_model(ModelName=model_name)
103
+ model_arn = model_detail.get("ModelArn", "")
104
+
105
+ if not self._matches_account(model_arn):
106
+ continue
107
+
108
+ tags_response = sagemaker_client.list_tags(ResourceArn=model_arn)
109
+ model_tags = tags_response.get("Tags", [])
110
+
111
+ if not self._matches_tags(model_tags):
112
+ continue
113
+
114
+ models.append(
115
+ {
116
+ "Region": self.region,
117
+ "ModelName": model_name,
118
+ "ModelArn": model_arn,
119
+ "CreationTime": model_detail.get("CreationTime"),
120
+ "ExecutionRoleArn": model_detail.get("ExecutionRoleArn"),
121
+ "PrimaryContainer": model_detail.get("PrimaryContainer"),
122
+ "Tags": model_tags,
123
+ }
124
+ )
125
+ except Exception as model_error:
126
+ logger.debug("Error getting SageMaker model details for %s: %s", model_name, model_error)
127
+ continue
128
+
129
+ except Exception as e:
130
+ self._handle_error(e, "SageMaker models")
131
+ return models
132
+
133
+ def get_sagemaker_notebooks(self) -> List[Dict[str, Any]]:
134
+ """
135
+ Get information about SageMaker notebook instances.
136
+
137
+ :return: List of SageMaker notebook instance information
138
+ :rtype: List[Dict[str, Any]]
139
+ """
140
+ notebooks = []
141
+ try:
142
+ sagemaker_client = self._get_client("sagemaker")
143
+ paginator = sagemaker_client.get_paginator("list_notebook_instances")
144
+
145
+ for page in paginator.paginate():
146
+ for notebook_summary in page.get("NotebookInstances", []):
147
+ notebook_name = notebook_summary.get("NotebookInstanceName")
148
+
149
+ try:
150
+ notebook_detail = sagemaker_client.describe_notebook_instance(
151
+ NotebookInstanceName=notebook_name
152
+ )
153
+ notebook_arn = notebook_detail.get("NotebookInstanceArn", "")
154
+
155
+ if not self._matches_account(notebook_arn):
156
+ continue
157
+
158
+ tags_response = sagemaker_client.list_tags(ResourceArn=notebook_arn)
159
+ notebook_tags = tags_response.get("Tags", [])
160
+
161
+ if not self._matches_tags(notebook_tags):
162
+ continue
163
+
164
+ notebooks.append(
165
+ {
166
+ "Region": self.region,
167
+ "NotebookInstanceName": notebook_name,
168
+ "NotebookInstanceArn": notebook_arn,
169
+ "NotebookInstanceStatus": notebook_detail.get("NotebookInstanceStatus"),
170
+ "InstanceType": notebook_detail.get("InstanceType"),
171
+ "CreationTime": notebook_detail.get("CreationTime"),
172
+ "LastModifiedTime": notebook_detail.get("LastModifiedTime"),
173
+ "Url": notebook_detail.get("Url"),
174
+ "Tags": notebook_tags,
175
+ }
176
+ )
177
+ except Exception as notebook_error:
178
+ logger.debug(
179
+ "Error getting SageMaker notebook details for %s: %s", notebook_name, notebook_error
180
+ )
181
+ continue
182
+
183
+ except Exception as e:
184
+ self._handle_error(e, "SageMaker notebook instances")
185
+ return notebooks
186
+
187
+ def get_sagemaker_training_jobs(self) -> List[Dict[str, Any]]:
188
+ """
189
+ Get information about SageMaker training jobs.
190
+
191
+ :return: List of SageMaker training job information
192
+ :rtype: List[Dict[str, Any]]
193
+ """
194
+ training_jobs = []
195
+ try:
196
+ sagemaker_client = self._get_client("sagemaker")
197
+ paginator = sagemaker_client.get_paginator("list_training_jobs")
198
+
199
+ for page in paginator.paginate():
200
+ for job_summary in page.get("TrainingJobSummaries", []):
201
+ job_name = job_summary.get("TrainingJobName")
202
+
203
+ try:
204
+ job_detail = sagemaker_client.describe_training_job(TrainingJobName=job_name)
205
+ job_arn = job_detail.get("TrainingJobArn", "")
206
+
207
+ if not self._matches_account(job_arn):
208
+ continue
209
+
210
+ tags_response = sagemaker_client.list_tags(ResourceArn=job_arn)
211
+ job_tags = tags_response.get("Tags", [])
212
+
213
+ if not self._matches_tags(job_tags):
214
+ continue
215
+
216
+ training_jobs.append(
217
+ {
218
+ "Region": self.region,
219
+ "TrainingJobName": job_name,
220
+ "TrainingJobArn": job_arn,
221
+ "TrainingJobStatus": job_detail.get("TrainingJobStatus"),
222
+ "CreationTime": job_detail.get("CreationTime"),
223
+ "TrainingStartTime": job_detail.get("TrainingStartTime"),
224
+ "TrainingEndTime": job_detail.get("TrainingEndTime"),
225
+ "AlgorithmSpecification": job_detail.get("AlgorithmSpecification"),
226
+ "Tags": job_tags,
227
+ }
228
+ )
229
+ except Exception as job_error:
230
+ logger.debug("Error getting SageMaker training job details for %s: %s", job_name, job_error)
231
+ continue
232
+
233
+ except Exception as e:
234
+ self._handle_error(e, "SageMaker training jobs")
235
+ return training_jobs
236
+
237
+ def get_rekognition_collections(self) -> List[Dict[str, Any]]:
238
+ """
239
+ Get information about Rekognition face collections.
240
+
241
+ :return: List of Rekognition collection information
242
+ :rtype: List[Dict[str, Any]]
243
+ """
244
+ collections = []
245
+ try:
246
+ rekognition_client = self._get_client("rekognition")
247
+ paginator = rekognition_client.get_paginator("list_collections")
248
+
249
+ for page in paginator.paginate():
250
+ for collection_id in page.get("CollectionIds", []):
251
+ try:
252
+ collection_detail = rekognition_client.describe_collection(CollectionId=collection_id)
253
+ collection_arn = collection_detail.get("CollectionARN", "")
254
+
255
+ if not self._matches_account(collection_arn):
256
+ continue
257
+
258
+ collections.append(
259
+ {
260
+ "Region": self.region,
261
+ "CollectionId": collection_id,
262
+ "CollectionARN": collection_arn,
263
+ "FaceCount": collection_detail.get("FaceCount"),
264
+ "FaceModelVersion": collection_detail.get("FaceModelVersion"),
265
+ "CreationTimestamp": collection_detail.get("CreationTimestamp"),
266
+ }
267
+ )
268
+ except Exception as collection_error:
269
+ logger.debug(
270
+ "Error getting Rekognition collection details for %s: %s", collection_id, collection_error
271
+ )
272
+ continue
273
+
274
+ except Exception as e:
275
+ self._handle_error(e, "Rekognition collections")
276
+ return collections
277
+
278
+ def get_comprehend_endpoints(self) -> List[Dict[str, Any]]:
279
+ """
280
+ Get information about Comprehend custom model endpoints.
281
+
282
+ :return: List of Comprehend endpoint information
283
+ :rtype: List[Dict[str, Any]]
284
+ """
285
+ endpoints = []
286
+ try:
287
+ comprehend_client = self._get_client("comprehend")
288
+ paginator = comprehend_client.get_paginator("list_endpoints")
289
+
290
+ for page in paginator.paginate():
291
+ for endpoint_props in page.get("EndpointPropertiesList", []):
292
+ endpoint_arn = endpoint_props.get("EndpointArn", "")
293
+
294
+ if not self._matches_account(endpoint_arn):
295
+ continue
296
+
297
+ try:
298
+ tags_response = comprehend_client.list_tags_for_resource(ResourceArn=endpoint_arn)
299
+ endpoint_tags = tags_response.get("Tags", [])
300
+
301
+ if not self._matches_tags(endpoint_tags):
302
+ continue
303
+
304
+ endpoints.append(
305
+ {
306
+ "Region": self.region,
307
+ "EndpointArn": endpoint_arn,
308
+ "Status": endpoint_props.get("Status"),
309
+ "ModelArn": endpoint_props.get("ModelArn"),
310
+ "DesiredInferenceUnits": endpoint_props.get("DesiredInferenceUnits"),
311
+ "CurrentInferenceUnits": endpoint_props.get("CurrentInferenceUnits"),
312
+ "CreationTime": endpoint_props.get("CreationTime"),
313
+ "LastModifiedTime": endpoint_props.get("LastModifiedTime"),
314
+ "Tags": endpoint_tags,
315
+ }
316
+ )
317
+ except Exception as tag_error:
318
+ logger.debug("Error getting Comprehend endpoint tags for %s: %s", endpoint_arn, tag_error)
319
+ continue
320
+
321
+ except Exception as e:
322
+ self._handle_error(e, "Comprehend endpoints")
323
+ return endpoints
324
+
325
+ def collect(self) -> Dict[str, Any]:
326
+ """
327
+ Collect machine learning resources based on enabled_services configuration.
328
+
329
+ :return: Dictionary containing enabled ML resource information
330
+ :rtype: Dict[str, Any]
331
+ """
332
+ result = {}
333
+
334
+ # SageMaker Endpoints
335
+ if self.enabled_services.get("sagemaker_endpoints", True):
336
+ result["SageMakerEndpoints"] = self.get_sagemaker_endpoints()
337
+
338
+ # SageMaker Models
339
+ if self.enabled_services.get("sagemaker_models", True):
340
+ result["SageMakerModels"] = self.get_sagemaker_models()
341
+
342
+ # SageMaker Notebook Instances
343
+ if self.enabled_services.get("sagemaker_notebooks", True):
344
+ result["SageMakerNotebooks"] = self.get_sagemaker_notebooks()
345
+
346
+ # SageMaker Training Jobs
347
+ if self.enabled_services.get("sagemaker_training_jobs", True):
348
+ result["SageMakerTrainingJobs"] = self.get_sagemaker_training_jobs()
349
+
350
+ # Rekognition Collections
351
+ if self.enabled_services.get("rekognition", True):
352
+ result["RekognitionCollections"] = self.get_rekognition_collections()
353
+
354
+ # Comprehend Endpoints
355
+ if self.enabled_services.get("comprehend", True):
356
+ result["ComprehendEndpoints"] = self.get_comprehend_endpoints()
357
+
358
+ return result