diff --git a/.openapi-generator/FILES b/.openapi-generator/FILES index ae34470..2700b22 100644 --- a/.openapi-generator/FILES +++ b/.openapi-generator/FILES @@ -81,6 +81,7 @@ docs/GroupRemoteInfoGithubEnterpriseTeam.md docs/GroupRemoteInfoGithubTeam.md docs/GroupRemoteInfoGitlabGroup.md docs/GroupRemoteInfoGoogleGroup.md +docs/GroupRemoteInfoGrafanaTeam.md docs/GroupRemoteInfoIncidentioOnCallSchedule.md docs/GroupRemoteInfoLdapGroup.md docs/GroupRemoteInfoOktaGroup.md @@ -90,6 +91,7 @@ docs/GroupRemoteInfoRootlyOnCallSchedule.md docs/GroupRemoteInfoSnowflakeRole.md docs/GroupRemoteInfoTailscaleGroup.md docs/GroupRemoteInfoTwingateGroup.md +docs/GroupRemoteInfoTwingateGroupSynced.md docs/GroupRemoteInfoWorkdayUserSecurityGroup.md docs/GroupResource.md docs/GroupResourceList.md @@ -207,6 +209,9 @@ docs/ResourceRemoteInfoGithubOrgRole.md docs/ResourceRemoteInfoGithubRepo.md docs/ResourceRemoteInfoGitlabProject.md docs/ResourceRemoteInfoGoogleWorkspaceRole.md +docs/ResourceRemoteInfoGrafanaDashboard.md +docs/ResourceRemoteInfoGrafanaFolder.md +docs/ResourceRemoteInfoGrafanaRole.md docs/ResourceRemoteInfoIlevelAdvancedRole.md docs/ResourceRemoteInfoNetsuiteRole.md docs/ResourceRemoteInfoOktaApp.md @@ -386,6 +391,7 @@ opal_security/models/group_remote_info_github_enterprise_team.py opal_security/models/group_remote_info_github_team.py opal_security/models/group_remote_info_gitlab_group.py opal_security/models/group_remote_info_google_group.py +opal_security/models/group_remote_info_grafana_team.py opal_security/models/group_remote_info_incidentio_on_call_schedule.py opal_security/models/group_remote_info_ldap_group.py opal_security/models/group_remote_info_okta_group.py @@ -395,6 +401,7 @@ opal_security/models/group_remote_info_rootly_on_call_schedule.py opal_security/models/group_remote_info_snowflake_role.py opal_security/models/group_remote_info_tailscale_group.py opal_security/models/group_remote_info_twingate_group.py +opal_security/models/group_remote_info_twingate_group_synced.py opal_security/models/group_remote_info_workday_user_security_group.py opal_security/models/group_resource.py opal_security/models/group_resource_list.py @@ -505,6 +512,9 @@ opal_security/models/resource_remote_info_github_org_role.py opal_security/models/resource_remote_info_github_repo.py opal_security/models/resource_remote_info_gitlab_project.py opal_security/models/resource_remote_info_google_workspace_role.py +opal_security/models/resource_remote_info_grafana_dashboard.py +opal_security/models/resource_remote_info_grafana_folder.py +opal_security/models/resource_remote_info_grafana_role.py opal_security/models/resource_remote_info_ilevel_advanced_role.py opal_security/models/resource_remote_info_netsuite_role.py opal_security/models/resource_remote_info_okta_app.py @@ -587,15 +597,9 @@ setup.cfg setup.py test-requirements.txt test/__init__.py -test/test_api_access_level_enum.py -test/test_group_remote_info_clickhouse_role.py -test/test_group_remote_info_twingate_group.py -test/test_paginated_tokens_list.py -test/test_resource_remote_info_clickhouse_database.py -test/test_resource_remote_info_clickhouse_table.py -test/test_resource_remote_info_datadog_role.py -test/test_resource_remote_info_netsuite_role.py -test/test_resource_remote_info_twingate_resource.py -test/test_token.py -test/test_tokens_api.py +test/test_group_remote_info_grafana_team.py +test/test_group_remote_info_twingate_group_synced.py +test/test_resource_remote_info_grafana_dashboard.py +test/test_resource_remote_info_grafana_folder.py +test/test_resource_remote_info_grafana_role.py tox.ini diff --git a/README.md b/README.md index 1ba7a07..6095201 100644 --- a/README.md +++ b/README.md @@ -353,6 +353,7 @@ Class | Method | HTTP request | Description - [GroupRemoteInfoGithubTeam](docs/GroupRemoteInfoGithubTeam.md) - [GroupRemoteInfoGitlabGroup](docs/GroupRemoteInfoGitlabGroup.md) - [GroupRemoteInfoGoogleGroup](docs/GroupRemoteInfoGoogleGroup.md) + - [GroupRemoteInfoGrafanaTeam](docs/GroupRemoteInfoGrafanaTeam.md) - [GroupRemoteInfoIncidentioOnCallSchedule](docs/GroupRemoteInfoIncidentioOnCallSchedule.md) - [GroupRemoteInfoLdapGroup](docs/GroupRemoteInfoLdapGroup.md) - [GroupRemoteInfoOktaGroup](docs/GroupRemoteInfoOktaGroup.md) @@ -362,6 +363,7 @@ Class | Method | HTTP request | Description - [GroupRemoteInfoSnowflakeRole](docs/GroupRemoteInfoSnowflakeRole.md) - [GroupRemoteInfoTailscaleGroup](docs/GroupRemoteInfoTailscaleGroup.md) - [GroupRemoteInfoTwingateGroup](docs/GroupRemoteInfoTwingateGroup.md) + - [GroupRemoteInfoTwingateGroupSynced](docs/GroupRemoteInfoTwingateGroupSynced.md) - [GroupRemoteInfoWorkdayUserSecurityGroup](docs/GroupRemoteInfoWorkdayUserSecurityGroup.md) - [GroupResource](docs/GroupResource.md) - [GroupResourceList](docs/GroupResourceList.md) @@ -472,6 +474,9 @@ Class | Method | HTTP request | Description - [ResourceRemoteInfoGithubRepo](docs/ResourceRemoteInfoGithubRepo.md) - [ResourceRemoteInfoGitlabProject](docs/ResourceRemoteInfoGitlabProject.md) - [ResourceRemoteInfoGoogleWorkspaceRole](docs/ResourceRemoteInfoGoogleWorkspaceRole.md) + - [ResourceRemoteInfoGrafanaDashboard](docs/ResourceRemoteInfoGrafanaDashboard.md) + - [ResourceRemoteInfoGrafanaFolder](docs/ResourceRemoteInfoGrafanaFolder.md) + - [ResourceRemoteInfoGrafanaRole](docs/ResourceRemoteInfoGrafanaRole.md) - [ResourceRemoteInfoIlevelAdvancedRole](docs/ResourceRemoteInfoIlevelAdvancedRole.md) - [ResourceRemoteInfoNetsuiteRole](docs/ResourceRemoteInfoNetsuiteRole.md) - [ResourceRemoteInfoOktaApp](docs/ResourceRemoteInfoOktaApp.md) diff --git a/api/openapi.yaml b/api/openapi.yaml index dd34b00..1755e0d 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -6213,17 +6213,41 @@ components: results: - group_id: f454d283-ca87-4a8a-bdbb-df212eca5353 app_id: b5a5ca27-0ea3-4d86-9199-2126d57d1fbd + name: Payments Production Admin description: This group represents Active Directory group "Payments Production Admin". We use this AD group to facilitate staging deployments and qualifying new releases. admin_owner_id: 7c86c85d-0651-43e2-a748-d69d658418e8 + group_leader_user_ids: + - 7c86c85d-0651-43e2-a748-d69d658418e8 + remote_id: 037m2jsg218b2wb + remote_name: Finance Team + group_type: ACTIVE_DIRECTORY_GROUP max_duration: 120 + recommended_duration: 60 + extensions_duration_in_minutes: 60 require_manager_approval: False require_support_ticket: False + require_mfa_to_approve: False + require_mfa_to_request: False + auto_approval: False + is_requestable: True - group_id: 99d0b81d-14be-4cf6-bd27-348b4af1d11b + app_id: a7c3e291-1234-4abc-9def-1234567890ab + name: Integrations On-Call description: Manages the Integrations Team on-call privileged resources. This group is automatically synced with the on-call rotation defined in PagerDuty. admin_owner_id: 4220bc12-ab8a-4b5d-be7b-f6bbcf9159f3 + group_leader_user_ids: [] + remote_id: pagerduty-schedule:P123XYZ + remote_name: Integrations On-Call + group_type: PAGERDUTY_ON_CALL_SCHEDULE max_duration: 360 + recommended_duration: 120 + extensions_duration_in_minutes: 0 require_manager_approval: False require_support_ticket: True + require_mfa_to_approve: False + require_mfa_to_request: False + auto_approval: False + is_requestable: True properties: next: description: @@ -6321,13 +6345,23 @@ components: example: group_id: f454d283-ca87-4a8a-bdbb-df212eca5353 app_id: b5a5ca27-0ea3-4d86-9199-2126d57d1fbd - remote_id: 037m2jsg218b2wb - remote_name: Finance Team + name: Payments Production Admin description: This group represents Active Directory group "Payments Production Admin". We use this AD group to facilitate staging deployments and qualifying new releases. admin_owner_id: 7c86c85d-0651-43e2-a748-d69d658418e8 + group_leader_user_ids: + - 7c86c85d-0651-43e2-a748-d69d658418e8 + remote_id: 037m2jsg218b2wb + remote_name: Finance Team + group_type: ACTIVE_DIRECTORY_GROUP max_duration: 120 + recommended_duration: 60 + extensions_duration_in_minutes: 60 require_manager_approval: False require_support_ticket: False + require_mfa_to_approve: False + require_mfa_to_request: False + auto_approval: False + is_requestable: True properties: group_id: description: The ID of the group. @@ -6825,6 +6859,7 @@ components: - GRAFANA_TEAM - CLICKHOUSE_ROLE - TWINGATE_GROUP + - TWINGATE_GROUP_SYNCED example: OPAL_GROUP type: string ResourceTypeEnum: @@ -7407,6 +7442,16 @@ components: type: object required: - group_id + twingate_group_synced: + description: Remote info for Twingate synced group. + properties: + group_id: + description: The id of the Twingate synced group. + example: R3JvdXA6MTIzNA== + type: string + type: object + required: + - group_id aws_sso_group: description: Remote info for AWS SSO group. properties: @@ -7612,6 +7657,16 @@ components: type: object required: - role_id + grafana_team: + description: Remote info for Grafana team. + properties: + team_id: + description: The ID of the team. + example: 2323 + type: string + type: object + required: + - team_id type: object ResourceRemoteInfo: description: Information that defines the remote resource. This replaces the deprecated remote_id and metadata fields. @@ -8440,6 +8495,36 @@ components: required: - database_name - table_name + grafana_folder: + description: Remote info for Grafana folder. + properties: + folder_uid: + description: The UID of the Grafana folder. + example: fffRTXX + type: string + type: object + required: + - folder_uid + grafana_dashboard: + description: Remote info for Grafana dashboard. + properties: + dashboard_uid: + description: The UID of the Grafana dashboard. + example: dddRTXX + type: string + type: object + required: + - dashboard_uid + grafana_role: + description: Remote info for Grafana role(fixed or custom). + properties: + role_uid: + description: The UID of the Grafana role. + example: rrfRTXX + type: string + type: object + required: + - role_uid type: object RiskSensitivityEnum: type: string @@ -9675,6 +9760,12 @@ components: type: integer example: 120 deprecated: true + parent_resource_id: + description: The ID of the parent resource. + example: f454d283-ca67-4a8a-bdbb-df212eca5345 + format: uuid + type: string + nullable: true request_configurations: type: array items: diff --git a/docs/GroupRemoteInfo.md b/docs/GroupRemoteInfo.md index 9246310..60444a8 100644 --- a/docs/GroupRemoteInfo.md +++ b/docs/GroupRemoteInfo.md @@ -9,6 +9,7 @@ Name | Type | Description | Notes **active_directory_group** | [**GroupRemoteInfoActiveDirectoryGroup**](GroupRemoteInfoActiveDirectoryGroup.md) | | [optional] **tailscale_group** | [**GroupRemoteInfoTailscaleGroup**](GroupRemoteInfoTailscaleGroup.md) | | [optional] **twingate_group** | [**GroupRemoteInfoTwingateGroup**](GroupRemoteInfoTwingateGroup.md) | | [optional] +**twingate_group_synced** | [**GroupRemoteInfoTwingateGroupSynced**](GroupRemoteInfoTwingateGroupSynced.md) | | [optional] **aws_sso_group** | [**GroupRemoteInfoAwsSsoGroup**](GroupRemoteInfoAwsSsoGroup.md) | | [optional] **databricks_account_group** | [**GroupRemoteInfoDatabricksAccountGroup**](GroupRemoteInfoDatabricksAccountGroup.md) | | [optional] **connector_group** | [**GroupRemoteInfoConnectorGroup**](GroupRemoteInfoConnectorGroup.md) | | [optional] @@ -29,6 +30,7 @@ Name | Type | Description | Notes **rootly_on_call_schedule** | [**GroupRemoteInfoRootlyOnCallSchedule**](GroupRemoteInfoRootlyOnCallSchedule.md) | | [optional] **devin_group** | [**GroupRemoteInfoDevinGroup**](GroupRemoteInfoDevinGroup.md) | | [optional] **clickhouse_role** | [**GroupRemoteInfoClickhouseRole**](GroupRemoteInfoClickhouseRole.md) | | [optional] +**grafana_team** | [**GroupRemoteInfoGrafanaTeam**](GroupRemoteInfoGrafanaTeam.md) | | [optional] ## Example diff --git a/docs/GroupRemoteInfoGrafanaTeam.md b/docs/GroupRemoteInfoGrafanaTeam.md new file mode 100644 index 0000000..97635c4 --- /dev/null +++ b/docs/GroupRemoteInfoGrafanaTeam.md @@ -0,0 +1,30 @@ +# GroupRemoteInfoGrafanaTeam + +Remote info for Grafana team. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**team_id** | **str** | The ID of the team. | + +## Example + +```python +from opal_security.models.group_remote_info_grafana_team import GroupRemoteInfoGrafanaTeam + +# TODO update the JSON string below +json = "{}" +# create an instance of GroupRemoteInfoGrafanaTeam from a JSON string +group_remote_info_grafana_team_instance = GroupRemoteInfoGrafanaTeam.from_json(json) +# print the JSON string representation of the object +print(GroupRemoteInfoGrafanaTeam.to_json()) + +# convert the object into a dict +group_remote_info_grafana_team_dict = group_remote_info_grafana_team_instance.to_dict() +# create an instance of GroupRemoteInfoGrafanaTeam from a dict +group_remote_info_grafana_team_from_dict = GroupRemoteInfoGrafanaTeam.from_dict(group_remote_info_grafana_team_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/docs/GroupRemoteInfoTwingateGroupSynced.md b/docs/GroupRemoteInfoTwingateGroupSynced.md new file mode 100644 index 0000000..c836996 --- /dev/null +++ b/docs/GroupRemoteInfoTwingateGroupSynced.md @@ -0,0 +1,30 @@ +# GroupRemoteInfoTwingateGroupSynced + +Remote info for Twingate synced group. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**group_id** | **str** | The id of the Twingate synced group. | + +## Example + +```python +from opal_security.models.group_remote_info_twingate_group_synced import GroupRemoteInfoTwingateGroupSynced + +# TODO update the JSON string below +json = "{}" +# create an instance of GroupRemoteInfoTwingateGroupSynced from a JSON string +group_remote_info_twingate_group_synced_instance = GroupRemoteInfoTwingateGroupSynced.from_json(json) +# print the JSON string representation of the object +print(GroupRemoteInfoTwingateGroupSynced.to_json()) + +# convert the object into a dict +group_remote_info_twingate_group_synced_dict = group_remote_info_twingate_group_synced_instance.to_dict() +# create an instance of GroupRemoteInfoTwingateGroupSynced from a dict +group_remote_info_twingate_group_synced_from_dict = GroupRemoteInfoTwingateGroupSynced.from_dict(group_remote_info_twingate_group_synced_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/docs/GroupTypeEnum.md b/docs/GroupTypeEnum.md index 21cf51a..f35a93b 100644 --- a/docs/GroupTypeEnum.md +++ b/docs/GroupTypeEnum.md @@ -58,6 +58,8 @@ The type of the group. * `TWINGATE_GROUP` (value: `'TWINGATE_GROUP'`) +* `TWINGATE_GROUP_SYNCED` (value: `'TWINGATE_GROUP_SYNCED'`) + [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/docs/ResourceRemoteInfo.md b/docs/ResourceRemoteInfo.md index b78ff34..4ab9f9d 100644 --- a/docs/ResourceRemoteInfo.md +++ b/docs/ResourceRemoteInfo.md @@ -73,6 +73,9 @@ Name | Type | Description | Notes **datadog_role** | [**ResourceRemoteInfoDatadogRole**](ResourceRemoteInfoDatadogRole.md) | | [optional] **clickhouse_database** | [**ResourceRemoteInfoClickhouseDatabase**](ResourceRemoteInfoClickhouseDatabase.md) | | [optional] **clickhouse_table** | [**ResourceRemoteInfoClickhouseTable**](ResourceRemoteInfoClickhouseTable.md) | | [optional] +**grafana_folder** | [**ResourceRemoteInfoGrafanaFolder**](ResourceRemoteInfoGrafanaFolder.md) | | [optional] +**grafana_dashboard** | [**ResourceRemoteInfoGrafanaDashboard**](ResourceRemoteInfoGrafanaDashboard.md) | | [optional] +**grafana_role** | [**ResourceRemoteInfoGrafanaRole**](ResourceRemoteInfoGrafanaRole.md) | | [optional] ## Example diff --git a/docs/ResourceRemoteInfoGrafanaDashboard.md b/docs/ResourceRemoteInfoGrafanaDashboard.md new file mode 100644 index 0000000..e90f411 --- /dev/null +++ b/docs/ResourceRemoteInfoGrafanaDashboard.md @@ -0,0 +1,30 @@ +# ResourceRemoteInfoGrafanaDashboard + +Remote info for Grafana dashboard. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**dashboard_uid** | **str** | The UID of the Grafana dashboard. | + +## Example + +```python +from opal_security.models.resource_remote_info_grafana_dashboard import ResourceRemoteInfoGrafanaDashboard + +# TODO update the JSON string below +json = "{}" +# create an instance of ResourceRemoteInfoGrafanaDashboard from a JSON string +resource_remote_info_grafana_dashboard_instance = ResourceRemoteInfoGrafanaDashboard.from_json(json) +# print the JSON string representation of the object +print(ResourceRemoteInfoGrafanaDashboard.to_json()) + +# convert the object into a dict +resource_remote_info_grafana_dashboard_dict = resource_remote_info_grafana_dashboard_instance.to_dict() +# create an instance of ResourceRemoteInfoGrafanaDashboard from a dict +resource_remote_info_grafana_dashboard_from_dict = ResourceRemoteInfoGrafanaDashboard.from_dict(resource_remote_info_grafana_dashboard_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/docs/ResourceRemoteInfoGrafanaFolder.md b/docs/ResourceRemoteInfoGrafanaFolder.md new file mode 100644 index 0000000..8ef59c6 --- /dev/null +++ b/docs/ResourceRemoteInfoGrafanaFolder.md @@ -0,0 +1,30 @@ +# ResourceRemoteInfoGrafanaFolder + +Remote info for Grafana folder. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**folder_uid** | **str** | The UID of the Grafana folder. | + +## Example + +```python +from opal_security.models.resource_remote_info_grafana_folder import ResourceRemoteInfoGrafanaFolder + +# TODO update the JSON string below +json = "{}" +# create an instance of ResourceRemoteInfoGrafanaFolder from a JSON string +resource_remote_info_grafana_folder_instance = ResourceRemoteInfoGrafanaFolder.from_json(json) +# print the JSON string representation of the object +print(ResourceRemoteInfoGrafanaFolder.to_json()) + +# convert the object into a dict +resource_remote_info_grafana_folder_dict = resource_remote_info_grafana_folder_instance.to_dict() +# create an instance of ResourceRemoteInfoGrafanaFolder from a dict +resource_remote_info_grafana_folder_from_dict = ResourceRemoteInfoGrafanaFolder.from_dict(resource_remote_info_grafana_folder_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/docs/ResourceRemoteInfoGrafanaRole.md b/docs/ResourceRemoteInfoGrafanaRole.md new file mode 100644 index 0000000..6bda2fb --- /dev/null +++ b/docs/ResourceRemoteInfoGrafanaRole.md @@ -0,0 +1,30 @@ +# ResourceRemoteInfoGrafanaRole + +Remote info for Grafana role(fixed or custom). + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**role_uid** | **str** | The UID of the Grafana role. | + +## Example + +```python +from opal_security.models.resource_remote_info_grafana_role import ResourceRemoteInfoGrafanaRole + +# TODO update the JSON string below +json = "{}" +# create an instance of ResourceRemoteInfoGrafanaRole from a JSON string +resource_remote_info_grafana_role_instance = ResourceRemoteInfoGrafanaRole.from_json(json) +# print the JSON string representation of the object +print(ResourceRemoteInfoGrafanaRole.to_json()) + +# convert the object into a dict +resource_remote_info_grafana_role_dict = resource_remote_info_grafana_role_instance.to_dict() +# create an instance of ResourceRemoteInfoGrafanaRole from a dict +resource_remote_info_grafana_role_from_dict = ResourceRemoteInfoGrafanaRole.from_dict(resource_remote_info_grafana_role_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/docs/UpdateResourceInfo.md b/docs/UpdateResourceInfo.md index c1fa4de..29865dd 100644 --- a/docs/UpdateResourceInfo.md +++ b/docs/UpdateResourceInfo.md @@ -26,6 +26,7 @@ Name | Type | Description | Notes **request_template_id** | **UUID** | The ID of the associated request template. Deprecated in favor of `request_configurations`. | [optional] **is_requestable** | **bool** | A bool representing whether or not to allow access requests to this resource. Deprecated in favor of `request_configurations`. | [optional] **extensions_duration_in_minutes** | **int** | The duration for which access can be extended (in minutes). Deprecated, set the extension duration in the request_configuration you want it to apply to. | [optional] +**parent_resource_id** | **UUID** | The ID of the parent resource. | [optional] **request_configurations** | [**List[RequestConfiguration]**](RequestConfiguration.md) | A list of configurations for requests to this resource. If not provided, the default request configuration will be used. | [optional] **request_configuration_list** | [**CreateRequestConfigurationInfoList**](CreateRequestConfigurationInfoList.md) | A list of configurations for requests to this resource. If not provided, the default request configuration will be used. Deprecated in favor of `request_configurations`. | [optional] diff --git a/opal_security/__init__.py b/opal_security/__init__.py index 5f39560..a6703a7 100644 --- a/opal_security/__init__.py +++ b/opal_security/__init__.py @@ -119,6 +119,7 @@ "GroupRemoteInfoGithubTeam", "GroupRemoteInfoGitlabGroup", "GroupRemoteInfoGoogleGroup", + "GroupRemoteInfoGrafanaTeam", "GroupRemoteInfoIncidentioOnCallSchedule", "GroupRemoteInfoLdapGroup", "GroupRemoteInfoOktaGroup", @@ -128,6 +129,7 @@ "GroupRemoteInfoSnowflakeRole", "GroupRemoteInfoTailscaleGroup", "GroupRemoteInfoTwingateGroup", + "GroupRemoteInfoTwingateGroupSynced", "GroupRemoteInfoWorkdayUserSecurityGroup", "GroupResource", "GroupResourceList", @@ -238,6 +240,9 @@ "ResourceRemoteInfoGithubRepo", "ResourceRemoteInfoGitlabProject", "ResourceRemoteInfoGoogleWorkspaceRole", + "ResourceRemoteInfoGrafanaDashboard", + "ResourceRemoteInfoGrafanaFolder", + "ResourceRemoteInfoGrafanaRole", "ResourceRemoteInfoIlevelAdvancedRole", "ResourceRemoteInfoNetsuiteRole", "ResourceRemoteInfoOktaApp", @@ -419,6 +424,7 @@ from opal_security.models.group_remote_info_github_team import GroupRemoteInfoGithubTeam as GroupRemoteInfoGithubTeam from opal_security.models.group_remote_info_gitlab_group import GroupRemoteInfoGitlabGroup as GroupRemoteInfoGitlabGroup from opal_security.models.group_remote_info_google_group import GroupRemoteInfoGoogleGroup as GroupRemoteInfoGoogleGroup +from opal_security.models.group_remote_info_grafana_team import GroupRemoteInfoGrafanaTeam as GroupRemoteInfoGrafanaTeam from opal_security.models.group_remote_info_incidentio_on_call_schedule import GroupRemoteInfoIncidentioOnCallSchedule as GroupRemoteInfoIncidentioOnCallSchedule from opal_security.models.group_remote_info_ldap_group import GroupRemoteInfoLdapGroup as GroupRemoteInfoLdapGroup from opal_security.models.group_remote_info_okta_group import GroupRemoteInfoOktaGroup as GroupRemoteInfoOktaGroup @@ -428,6 +434,7 @@ from opal_security.models.group_remote_info_snowflake_role import GroupRemoteInfoSnowflakeRole as GroupRemoteInfoSnowflakeRole from opal_security.models.group_remote_info_tailscale_group import GroupRemoteInfoTailscaleGroup as GroupRemoteInfoTailscaleGroup from opal_security.models.group_remote_info_twingate_group import GroupRemoteInfoTwingateGroup as GroupRemoteInfoTwingateGroup +from opal_security.models.group_remote_info_twingate_group_synced import GroupRemoteInfoTwingateGroupSynced as GroupRemoteInfoTwingateGroupSynced from opal_security.models.group_remote_info_workday_user_security_group import GroupRemoteInfoWorkdayUserSecurityGroup as GroupRemoteInfoWorkdayUserSecurityGroup from opal_security.models.group_resource import GroupResource as GroupResource from opal_security.models.group_resource_list import GroupResourceList as GroupResourceList @@ -538,6 +545,9 @@ from opal_security.models.resource_remote_info_github_repo import ResourceRemoteInfoGithubRepo as ResourceRemoteInfoGithubRepo from opal_security.models.resource_remote_info_gitlab_project import ResourceRemoteInfoGitlabProject as ResourceRemoteInfoGitlabProject from opal_security.models.resource_remote_info_google_workspace_role import ResourceRemoteInfoGoogleWorkspaceRole as ResourceRemoteInfoGoogleWorkspaceRole +from opal_security.models.resource_remote_info_grafana_dashboard import ResourceRemoteInfoGrafanaDashboard as ResourceRemoteInfoGrafanaDashboard +from opal_security.models.resource_remote_info_grafana_folder import ResourceRemoteInfoGrafanaFolder as ResourceRemoteInfoGrafanaFolder +from opal_security.models.resource_remote_info_grafana_role import ResourceRemoteInfoGrafanaRole as ResourceRemoteInfoGrafanaRole from opal_security.models.resource_remote_info_ilevel_advanced_role import ResourceRemoteInfoIlevelAdvancedRole as ResourceRemoteInfoIlevelAdvancedRole from opal_security.models.resource_remote_info_netsuite_role import ResourceRemoteInfoNetsuiteRole as ResourceRemoteInfoNetsuiteRole from opal_security.models.resource_remote_info_okta_app import ResourceRemoteInfoOktaApp as ResourceRemoteInfoOktaApp diff --git a/opal_security/models/__init__.py b/opal_security/models/__init__.py index 306be3e..feb0a50 100644 --- a/opal_security/models/__init__.py +++ b/opal_security/models/__init__.py @@ -85,6 +85,7 @@ from opal_security.models.group_remote_info_github_team import GroupRemoteInfoGithubTeam from opal_security.models.group_remote_info_gitlab_group import GroupRemoteInfoGitlabGroup from opal_security.models.group_remote_info_google_group import GroupRemoteInfoGoogleGroup +from opal_security.models.group_remote_info_grafana_team import GroupRemoteInfoGrafanaTeam from opal_security.models.group_remote_info_incidentio_on_call_schedule import GroupRemoteInfoIncidentioOnCallSchedule from opal_security.models.group_remote_info_ldap_group import GroupRemoteInfoLdapGroup from opal_security.models.group_remote_info_okta_group import GroupRemoteInfoOktaGroup @@ -94,6 +95,7 @@ from opal_security.models.group_remote_info_snowflake_role import GroupRemoteInfoSnowflakeRole from opal_security.models.group_remote_info_tailscale_group import GroupRemoteInfoTailscaleGroup from opal_security.models.group_remote_info_twingate_group import GroupRemoteInfoTwingateGroup +from opal_security.models.group_remote_info_twingate_group_synced import GroupRemoteInfoTwingateGroupSynced from opal_security.models.group_remote_info_workday_user_security_group import GroupRemoteInfoWorkdayUserSecurityGroup from opal_security.models.group_resource import GroupResource from opal_security.models.group_resource_list import GroupResourceList @@ -204,6 +206,9 @@ from opal_security.models.resource_remote_info_github_repo import ResourceRemoteInfoGithubRepo from opal_security.models.resource_remote_info_gitlab_project import ResourceRemoteInfoGitlabProject from opal_security.models.resource_remote_info_google_workspace_role import ResourceRemoteInfoGoogleWorkspaceRole +from opal_security.models.resource_remote_info_grafana_dashboard import ResourceRemoteInfoGrafanaDashboard +from opal_security.models.resource_remote_info_grafana_folder import ResourceRemoteInfoGrafanaFolder +from opal_security.models.resource_remote_info_grafana_role import ResourceRemoteInfoGrafanaRole from opal_security.models.resource_remote_info_ilevel_advanced_role import ResourceRemoteInfoIlevelAdvancedRole from opal_security.models.resource_remote_info_netsuite_role import ResourceRemoteInfoNetsuiteRole from opal_security.models.resource_remote_info_okta_app import ResourceRemoteInfoOktaApp diff --git a/opal_security/models/group_remote_info.py b/opal_security/models/group_remote_info.py index db3c0c7..e5c4597 100644 --- a/opal_security/models/group_remote_info.py +++ b/opal_security/models/group_remote_info.py @@ -33,6 +33,7 @@ from opal_security.models.group_remote_info_github_team import GroupRemoteInfoGithubTeam from opal_security.models.group_remote_info_gitlab_group import GroupRemoteInfoGitlabGroup from opal_security.models.group_remote_info_google_group import GroupRemoteInfoGoogleGroup +from opal_security.models.group_remote_info_grafana_team import GroupRemoteInfoGrafanaTeam from opal_security.models.group_remote_info_incidentio_on_call_schedule import GroupRemoteInfoIncidentioOnCallSchedule from opal_security.models.group_remote_info_ldap_group import GroupRemoteInfoLdapGroup from opal_security.models.group_remote_info_okta_group import GroupRemoteInfoOktaGroup @@ -42,6 +43,7 @@ from opal_security.models.group_remote_info_snowflake_role import GroupRemoteInfoSnowflakeRole from opal_security.models.group_remote_info_tailscale_group import GroupRemoteInfoTailscaleGroup from opal_security.models.group_remote_info_twingate_group import GroupRemoteInfoTwingateGroup +from opal_security.models.group_remote_info_twingate_group_synced import GroupRemoteInfoTwingateGroupSynced from opal_security.models.group_remote_info_workday_user_security_group import GroupRemoteInfoWorkdayUserSecurityGroup from typing import Optional, Set from typing_extensions import Self @@ -53,6 +55,7 @@ class GroupRemoteInfo(BaseModel): active_directory_group: Optional[GroupRemoteInfoActiveDirectoryGroup] = None tailscale_group: Optional[GroupRemoteInfoTailscaleGroup] = None twingate_group: Optional[GroupRemoteInfoTwingateGroup] = None + twingate_group_synced: Optional[GroupRemoteInfoTwingateGroupSynced] = None aws_sso_group: Optional[GroupRemoteInfoAwsSsoGroup] = None databricks_account_group: Optional[GroupRemoteInfoDatabricksAccountGroup] = None connector_group: Optional[GroupRemoteInfoConnectorGroup] = None @@ -73,8 +76,9 @@ class GroupRemoteInfo(BaseModel): rootly_on_call_schedule: Optional[GroupRemoteInfoRootlyOnCallSchedule] = None devin_group: Optional[GroupRemoteInfoDevinGroup] = None clickhouse_role: Optional[GroupRemoteInfoClickhouseRole] = None + grafana_team: Optional[GroupRemoteInfoGrafanaTeam] = None additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = ["active_directory_group", "tailscale_group", "twingate_group", "aws_sso_group", "databricks_account_group", "connector_group", "github_team", "github_enterprise_team", "gitlab_group", "google_group", "ldap_group", "okta_group", "duo_group", "azure_ad_security_group", "azure_ad_microsoft_365_group", "snowflake_role", "okta_group_rule", "workday_user_security_group", "pagerduty_on_call_schedule", "incidentio_on_call_schedule", "rootly_on_call_schedule", "devin_group", "clickhouse_role"] + __properties: ClassVar[List[str]] = ["active_directory_group", "tailscale_group", "twingate_group", "twingate_group_synced", "aws_sso_group", "databricks_account_group", "connector_group", "github_team", "github_enterprise_team", "gitlab_group", "google_group", "ldap_group", "okta_group", "duo_group", "azure_ad_security_group", "azure_ad_microsoft_365_group", "snowflake_role", "okta_group_rule", "workday_user_security_group", "pagerduty_on_call_schedule", "incidentio_on_call_schedule", "rootly_on_call_schedule", "devin_group", "clickhouse_role", "grafana_team"] model_config = ConfigDict( populate_by_name=True, @@ -126,6 +130,9 @@ def to_dict(self) -> Dict[str, Any]: # override the default output from pydantic by calling `to_dict()` of twingate_group if self.twingate_group: _dict['twingate_group'] = self.twingate_group.to_dict() + # override the default output from pydantic by calling `to_dict()` of twingate_group_synced + if self.twingate_group_synced: + _dict['twingate_group_synced'] = self.twingate_group_synced.to_dict() # override the default output from pydantic by calling `to_dict()` of aws_sso_group if self.aws_sso_group: _dict['aws_sso_group'] = self.aws_sso_group.to_dict() @@ -186,6 +193,9 @@ def to_dict(self) -> Dict[str, Any]: # override the default output from pydantic by calling `to_dict()` of clickhouse_role if self.clickhouse_role: _dict['clickhouse_role'] = self.clickhouse_role.to_dict() + # override the default output from pydantic by calling `to_dict()` of grafana_team + if self.grafana_team: + _dict['grafana_team'] = self.grafana_team.to_dict() # puts key-value pairs in additional_properties in the top level if self.additional_properties is not None: for _key, _value in self.additional_properties.items(): @@ -206,6 +216,7 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "active_directory_group": GroupRemoteInfoActiveDirectoryGroup.from_dict(obj["active_directory_group"]) if obj.get("active_directory_group") is not None else None, "tailscale_group": GroupRemoteInfoTailscaleGroup.from_dict(obj["tailscale_group"]) if obj.get("tailscale_group") is not None else None, "twingate_group": GroupRemoteInfoTwingateGroup.from_dict(obj["twingate_group"]) if obj.get("twingate_group") is not None else None, + "twingate_group_synced": GroupRemoteInfoTwingateGroupSynced.from_dict(obj["twingate_group_synced"]) if obj.get("twingate_group_synced") is not None else None, "aws_sso_group": GroupRemoteInfoAwsSsoGroup.from_dict(obj["aws_sso_group"]) if obj.get("aws_sso_group") is not None else None, "databricks_account_group": GroupRemoteInfoDatabricksAccountGroup.from_dict(obj["databricks_account_group"]) if obj.get("databricks_account_group") is not None else None, "connector_group": GroupRemoteInfoConnectorGroup.from_dict(obj["connector_group"]) if obj.get("connector_group") is not None else None, @@ -225,7 +236,8 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "incidentio_on_call_schedule": GroupRemoteInfoIncidentioOnCallSchedule.from_dict(obj["incidentio_on_call_schedule"]) if obj.get("incidentio_on_call_schedule") is not None else None, "rootly_on_call_schedule": GroupRemoteInfoRootlyOnCallSchedule.from_dict(obj["rootly_on_call_schedule"]) if obj.get("rootly_on_call_schedule") is not None else None, "devin_group": GroupRemoteInfoDevinGroup.from_dict(obj["devin_group"]) if obj.get("devin_group") is not None else None, - "clickhouse_role": GroupRemoteInfoClickhouseRole.from_dict(obj["clickhouse_role"]) if obj.get("clickhouse_role") is not None else None + "clickhouse_role": GroupRemoteInfoClickhouseRole.from_dict(obj["clickhouse_role"]) if obj.get("clickhouse_role") is not None else None, + "grafana_team": GroupRemoteInfoGrafanaTeam.from_dict(obj["grafana_team"]) if obj.get("grafana_team") is not None else None }) # store additional fields in additional_properties for _key in obj.keys(): diff --git a/opal_security/models/group_remote_info_grafana_team.py b/opal_security/models/group_remote_info_grafana_team.py new file mode 100644 index 0000000..45f2d8f --- /dev/null +++ b/opal_security/models/group_remote_info_grafana_team.py @@ -0,0 +1,101 @@ +# coding: utf-8 + +""" + Opal API + + The Opal API is a RESTful API that allows you to interact with the Opal Security platform programmatically. + + The version of the OpenAPI document: 1.0 + Contact: hello@opal.dev + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class GroupRemoteInfoGrafanaTeam(BaseModel): + """ + Remote info for Grafana team. + """ # noqa: E501 + team_id: StrictStr = Field(description="The ID of the team.") + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["team_id"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of GroupRemoteInfoGrafanaTeam from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + excluded_fields: Set[str] = set([ + "additional_properties", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of GroupRemoteInfoGrafanaTeam from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "team_id": obj.get("team_id") + }) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj + + diff --git a/opal_security/models/group_remote_info_twingate_group_synced.py b/opal_security/models/group_remote_info_twingate_group_synced.py new file mode 100644 index 0000000..6d1f275 --- /dev/null +++ b/opal_security/models/group_remote_info_twingate_group_synced.py @@ -0,0 +1,101 @@ +# coding: utf-8 + +""" + Opal API + + The Opal API is a RESTful API that allows you to interact with the Opal Security platform programmatically. + + The version of the OpenAPI document: 1.0 + Contact: hello@opal.dev + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class GroupRemoteInfoTwingateGroupSynced(BaseModel): + """ + Remote info for Twingate synced group. + """ # noqa: E501 + group_id: StrictStr = Field(description="The id of the Twingate synced group.") + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["group_id"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of GroupRemoteInfoTwingateGroupSynced from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + excluded_fields: Set[str] = set([ + "additional_properties", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of GroupRemoteInfoTwingateGroupSynced from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "group_id": obj.get("group_id") + }) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj + + diff --git a/opal_security/models/group_type_enum.py b/opal_security/models/group_type_enum.py index 2ebd21e..8eccdd0 100644 --- a/opal_security/models/group_type_enum.py +++ b/opal_security/models/group_type_enum.py @@ -54,6 +54,7 @@ class GroupTypeEnum(str, Enum): GRAFANA_TEAM = 'GRAFANA_TEAM' CLICKHOUSE_ROLE = 'CLICKHOUSE_ROLE' TWINGATE_GROUP = 'TWINGATE_GROUP' + TWINGATE_GROUP_SYNCED = 'TWINGATE_GROUP_SYNCED' @classmethod def from_json(cls, json_str: str) -> Self: diff --git a/opal_security/models/resource_remote_info.py b/opal_security/models/resource_remote_info.py index dea3112..8329c69 100644 --- a/opal_security/models/resource_remote_info.py +++ b/opal_security/models/resource_remote_info.py @@ -68,6 +68,9 @@ from opal_security.models.resource_remote_info_github_repo import ResourceRemoteInfoGithubRepo from opal_security.models.resource_remote_info_gitlab_project import ResourceRemoteInfoGitlabProject from opal_security.models.resource_remote_info_google_workspace_role import ResourceRemoteInfoGoogleWorkspaceRole +from opal_security.models.resource_remote_info_grafana_dashboard import ResourceRemoteInfoGrafanaDashboard +from opal_security.models.resource_remote_info_grafana_folder import ResourceRemoteInfoGrafanaFolder +from opal_security.models.resource_remote_info_grafana_role import ResourceRemoteInfoGrafanaRole from opal_security.models.resource_remote_info_ilevel_advanced_role import ResourceRemoteInfoIlevelAdvancedRole from opal_security.models.resource_remote_info_netsuite_role import ResourceRemoteInfoNetsuiteRole from opal_security.models.resource_remote_info_okta_app import ResourceRemoteInfoOktaApp @@ -161,8 +164,11 @@ class ResourceRemoteInfo(BaseModel): datadog_role: Optional[ResourceRemoteInfoDatadogRole] = None clickhouse_database: Optional[ResourceRemoteInfoClickhouseDatabase] = None clickhouse_table: Optional[ResourceRemoteInfoClickhouseTable] = None + grafana_folder: Optional[ResourceRemoteInfoGrafanaFolder] = None + grafana_dashboard: Optional[ResourceRemoteInfoGrafanaDashboard] = None + grafana_role: Optional[ResourceRemoteInfoGrafanaRole] = None additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = ["databricks_account_service_principal", "azure_subscription", "azure_resource_group", "azure_management_group", "azure_virtual_machine", "azure_storage_account", "azure_storage_container", "azure_sql_server", "azure_sql_database", "azure_sql_managed_instance", "azure_sql_managed_database", "azure_user_assigned_managed_identity", "azure_enterprise_app", "azure_entra_id_role", "aws_organizational_unit", "aws_account", "aws_permission_set", "aws_iam_role", "aws_ec2_instance", "aws_rds_cluster", "aws_rds_instance", "aws_eks_cluster", "custom_connector", "gcp_organization", "gcp_bucket", "gcp_compute_instance", "gcp_big_query_dataset", "gcp_big_query_table", "gcp_folder", "gcp_gke_cluster", "gcp_project", "gcp_sql_instance", "gcp_service_account", "google_workspace_role", "github_repo", "github_org_role", "github_org", "github_enterprise_role", "gitlab_project", "okta_app", "okta_standard_role", "okta_custom_role", "snowflake_database", "snowflake_schema", "snowflake_table", "ilevel_advanced_role", "tailscale_ssh", "twingate_resource", "pagerduty_role", "workday_role", "salesforce_permission_set", "salesforce_profile", "salesforce_role", "teleport_role", "datastax_astra_role", "coupa_role", "cursor_organization", "openai_platform_project", "openai_platform_service_account", "anthropic_workspace", "oracle_fusion_role", "devin_organization", "devin_role", "netsuite_role", "datadog_role", "clickhouse_database", "clickhouse_table"] + __properties: ClassVar[List[str]] = ["databricks_account_service_principal", "azure_subscription", "azure_resource_group", "azure_management_group", "azure_virtual_machine", "azure_storage_account", "azure_storage_container", "azure_sql_server", "azure_sql_database", "azure_sql_managed_instance", "azure_sql_managed_database", "azure_user_assigned_managed_identity", "azure_enterprise_app", "azure_entra_id_role", "aws_organizational_unit", "aws_account", "aws_permission_set", "aws_iam_role", "aws_ec2_instance", "aws_rds_cluster", "aws_rds_instance", "aws_eks_cluster", "custom_connector", "gcp_organization", "gcp_bucket", "gcp_compute_instance", "gcp_big_query_dataset", "gcp_big_query_table", "gcp_folder", "gcp_gke_cluster", "gcp_project", "gcp_sql_instance", "gcp_service_account", "google_workspace_role", "github_repo", "github_org_role", "github_org", "github_enterprise_role", "gitlab_project", "okta_app", "okta_standard_role", "okta_custom_role", "snowflake_database", "snowflake_schema", "snowflake_table", "ilevel_advanced_role", "tailscale_ssh", "twingate_resource", "pagerduty_role", "workday_role", "salesforce_permission_set", "salesforce_profile", "salesforce_role", "teleport_role", "datastax_astra_role", "coupa_role", "cursor_organization", "openai_platform_project", "openai_platform_service_account", "anthropic_workspace", "oracle_fusion_role", "devin_organization", "devin_role", "netsuite_role", "datadog_role", "clickhouse_database", "clickhouse_table", "grafana_folder", "grafana_dashboard", "grafana_role"] model_config = ConfigDict( populate_by_name=True, @@ -406,6 +412,15 @@ def to_dict(self) -> Dict[str, Any]: # override the default output from pydantic by calling `to_dict()` of clickhouse_table if self.clickhouse_table: _dict['clickhouse_table'] = self.clickhouse_table.to_dict() + # override the default output from pydantic by calling `to_dict()` of grafana_folder + if self.grafana_folder: + _dict['grafana_folder'] = self.grafana_folder.to_dict() + # override the default output from pydantic by calling `to_dict()` of grafana_dashboard + if self.grafana_dashboard: + _dict['grafana_dashboard'] = self.grafana_dashboard.to_dict() + # override the default output from pydantic by calling `to_dict()` of grafana_role + if self.grafana_role: + _dict['grafana_role'] = self.grafana_role.to_dict() # puts key-value pairs in additional_properties in the top level if self.additional_properties is not None: for _key, _value in self.additional_properties.items(): @@ -489,7 +504,10 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "netsuite_role": ResourceRemoteInfoNetsuiteRole.from_dict(obj["netsuite_role"]) if obj.get("netsuite_role") is not None else None, "datadog_role": ResourceRemoteInfoDatadogRole.from_dict(obj["datadog_role"]) if obj.get("datadog_role") is not None else None, "clickhouse_database": ResourceRemoteInfoClickhouseDatabase.from_dict(obj["clickhouse_database"]) if obj.get("clickhouse_database") is not None else None, - "clickhouse_table": ResourceRemoteInfoClickhouseTable.from_dict(obj["clickhouse_table"]) if obj.get("clickhouse_table") is not None else None + "clickhouse_table": ResourceRemoteInfoClickhouseTable.from_dict(obj["clickhouse_table"]) if obj.get("clickhouse_table") is not None else None, + "grafana_folder": ResourceRemoteInfoGrafanaFolder.from_dict(obj["grafana_folder"]) if obj.get("grafana_folder") is not None else None, + "grafana_dashboard": ResourceRemoteInfoGrafanaDashboard.from_dict(obj["grafana_dashboard"]) if obj.get("grafana_dashboard") is not None else None, + "grafana_role": ResourceRemoteInfoGrafanaRole.from_dict(obj["grafana_role"]) if obj.get("grafana_role") is not None else None }) # store additional fields in additional_properties for _key in obj.keys(): diff --git a/opal_security/models/resource_remote_info_grafana_dashboard.py b/opal_security/models/resource_remote_info_grafana_dashboard.py new file mode 100644 index 0000000..79c0e9d --- /dev/null +++ b/opal_security/models/resource_remote_info_grafana_dashboard.py @@ -0,0 +1,101 @@ +# coding: utf-8 + +""" + Opal API + + The Opal API is a RESTful API that allows you to interact with the Opal Security platform programmatically. + + The version of the OpenAPI document: 1.0 + Contact: hello@opal.dev + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class ResourceRemoteInfoGrafanaDashboard(BaseModel): + """ + Remote info for Grafana dashboard. + """ # noqa: E501 + dashboard_uid: StrictStr = Field(description="The UID of the Grafana dashboard.") + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["dashboard_uid"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ResourceRemoteInfoGrafanaDashboard from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + excluded_fields: Set[str] = set([ + "additional_properties", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ResourceRemoteInfoGrafanaDashboard from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "dashboard_uid": obj.get("dashboard_uid") + }) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj + + diff --git a/opal_security/models/resource_remote_info_grafana_folder.py b/opal_security/models/resource_remote_info_grafana_folder.py new file mode 100644 index 0000000..355a492 --- /dev/null +++ b/opal_security/models/resource_remote_info_grafana_folder.py @@ -0,0 +1,101 @@ +# coding: utf-8 + +""" + Opal API + + The Opal API is a RESTful API that allows you to interact with the Opal Security platform programmatically. + + The version of the OpenAPI document: 1.0 + Contact: hello@opal.dev + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class ResourceRemoteInfoGrafanaFolder(BaseModel): + """ + Remote info for Grafana folder. + """ # noqa: E501 + folder_uid: StrictStr = Field(description="The UID of the Grafana folder.") + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["folder_uid"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ResourceRemoteInfoGrafanaFolder from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + excluded_fields: Set[str] = set([ + "additional_properties", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ResourceRemoteInfoGrafanaFolder from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "folder_uid": obj.get("folder_uid") + }) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj + + diff --git a/opal_security/models/resource_remote_info_grafana_role.py b/opal_security/models/resource_remote_info_grafana_role.py new file mode 100644 index 0000000..4855d49 --- /dev/null +++ b/opal_security/models/resource_remote_info_grafana_role.py @@ -0,0 +1,101 @@ +# coding: utf-8 + +""" + Opal API + + The Opal API is a RESTful API that allows you to interact with the Opal Security platform programmatically. + + The version of the OpenAPI document: 1.0 + Contact: hello@opal.dev + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class ResourceRemoteInfoGrafanaRole(BaseModel): + """ + Remote info for Grafana role(fixed or custom). + """ # noqa: E501 + role_uid: StrictStr = Field(description="The UID of the Grafana role.") + additional_properties: Dict[str, Any] = {} + __properties: ClassVar[List[str]] = ["role_uid"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ResourceRemoteInfoGrafanaRole from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * Fields in `self.additional_properties` are added to the output dict. + """ + excluded_fields: Set[str] = set([ + "additional_properties", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ResourceRemoteInfoGrafanaRole from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "role_uid": obj.get("role_uid") + }) + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + return _obj + + diff --git a/opal_security/models/update_resource_info.py b/opal_security/models/update_resource_info.py index 22774f5..6c46b86 100644 --- a/opal_security/models/update_resource_info.py +++ b/opal_security/models/update_resource_info.py @@ -53,10 +53,11 @@ class UpdateResourceInfo(BaseModel): request_template_id: Optional[UUID] = Field(default=None, description="The ID of the associated request template. Deprecated in favor of `request_configurations`.") is_requestable: Optional[StrictBool] = Field(default=None, description="A bool representing whether or not to allow access requests to this resource. Deprecated in favor of `request_configurations`.") extensions_duration_in_minutes: Optional[StrictInt] = Field(default=None, description="The duration for which access can be extended (in minutes). Deprecated, set the extension duration in the request_configuration you want it to apply to.") + parent_resource_id: Optional[UUID] = Field(default=None, description="The ID of the parent resource.") request_configurations: Optional[List[RequestConfiguration]] = Field(default=None, description="A list of configurations for requests to this resource. If not provided, the default request configuration will be used.") request_configuration_list: Optional[CreateRequestConfigurationInfoList] = Field(default=None, description="A list of configurations for requests to this resource. If not provided, the default request configuration will be used. Deprecated in favor of `request_configurations`.") additional_properties: Dict[str, Any] = {} - __properties: ClassVar[List[str]] = ["resource_id", "name", "description", "admin_owner_id", "max_duration", "recommended_duration", "require_manager_approval", "require_support_ticket", "folder_id", "require_mfa_to_approve", "require_mfa_to_request", "require_mfa_to_connect", "auto_approval", "ticket_propagation", "custom_request_notification", "risk_sensitivity_override", "configuration_template_id", "request_template_id", "is_requestable", "extensions_duration_in_minutes", "request_configurations", "request_configuration_list"] + __properties: ClassVar[List[str]] = ["resource_id", "name", "description", "admin_owner_id", "max_duration", "recommended_duration", "require_manager_approval", "require_support_ticket", "folder_id", "require_mfa_to_approve", "require_mfa_to_request", "require_mfa_to_connect", "auto_approval", "ticket_propagation", "custom_request_notification", "risk_sensitivity_override", "configuration_template_id", "request_template_id", "is_requestable", "extensions_duration_in_minutes", "parent_resource_id", "request_configurations", "request_configuration_list"] model_config = ConfigDict( populate_by_name=True, @@ -149,6 +150,7 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "request_template_id": obj.get("request_template_id"), "is_requestable": obj.get("is_requestable"), "extensions_duration_in_minutes": obj.get("extensions_duration_in_minutes"), + "parent_resource_id": obj.get("parent_resource_id"), "request_configurations": [RequestConfiguration.from_dict(_item) for _item in obj["request_configurations"]] if obj.get("request_configurations") is not None else None, "request_configuration_list": CreateRequestConfigurationInfoList.from_dict(obj["request_configuration_list"]) if obj.get("request_configuration_list") is not None else None }) diff --git a/pyproject.toml b/pyproject.toml index 4bed9f2..bfd1432 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "opal_security" -dynamic = ["version"] +version = "1.0.0" description = "Opal API" authors = [ {name = "Opal Team",email = "hello@opal.dev"}, @@ -32,7 +32,7 @@ mypy = ">= 1.5" [build-system] -requires = ["setuptools", "setuptools_scm"] +requires = ["setuptools"] build-backend = "setuptools.build_meta" [tool.pylint.'MESSAGES CONTROL'] diff --git a/test/test_group_remote_info_grafana_team.py b/test/test_group_remote_info_grafana_team.py new file mode 100644 index 0000000..4b968b7 --- /dev/null +++ b/test/test_group_remote_info_grafana_team.py @@ -0,0 +1,53 @@ +# coding: utf-8 + +""" + Opal API + + The Opal API is a RESTful API that allows you to interact with the Opal Security platform programmatically. + + The version of the OpenAPI document: 1.0 + Contact: hello@opal.dev + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest + +from opal_security.models.group_remote_info_grafana_team import GroupRemoteInfoGrafanaTeam + +class TestGroupRemoteInfoGrafanaTeam(unittest.TestCase): + """GroupRemoteInfoGrafanaTeam unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> GroupRemoteInfoGrafanaTeam: + """Test GroupRemoteInfoGrafanaTeam + include_optional is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `GroupRemoteInfoGrafanaTeam` + """ + model = GroupRemoteInfoGrafanaTeam() + if include_optional: + return GroupRemoteInfoGrafanaTeam( + team_id = '2323' + ) + else: + return GroupRemoteInfoGrafanaTeam( + team_id = '2323', + ) + """ + + def testGroupRemoteInfoGrafanaTeam(self): + """Test GroupRemoteInfoGrafanaTeam""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_group_remote_info_twingate_group_synced.py b/test/test_group_remote_info_twingate_group_synced.py new file mode 100644 index 0000000..2699e00 --- /dev/null +++ b/test/test_group_remote_info_twingate_group_synced.py @@ -0,0 +1,53 @@ +# coding: utf-8 + +""" + Opal API + + The Opal API is a RESTful API that allows you to interact with the Opal Security platform programmatically. + + The version of the OpenAPI document: 1.0 + Contact: hello@opal.dev + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest + +from opal_security.models.group_remote_info_twingate_group_synced import GroupRemoteInfoTwingateGroupSynced + +class TestGroupRemoteInfoTwingateGroupSynced(unittest.TestCase): + """GroupRemoteInfoTwingateGroupSynced unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> GroupRemoteInfoTwingateGroupSynced: + """Test GroupRemoteInfoTwingateGroupSynced + include_optional is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `GroupRemoteInfoTwingateGroupSynced` + """ + model = GroupRemoteInfoTwingateGroupSynced() + if include_optional: + return GroupRemoteInfoTwingateGroupSynced( + group_id = 'R3JvdXA6MTIzNA==' + ) + else: + return GroupRemoteInfoTwingateGroupSynced( + group_id = 'R3JvdXA6MTIzNA==', + ) + """ + + def testGroupRemoteInfoTwingateGroupSynced(self): + """Test GroupRemoteInfoTwingateGroupSynced""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_resource_remote_info_grafana_dashboard.py b/test/test_resource_remote_info_grafana_dashboard.py new file mode 100644 index 0000000..918ada9 --- /dev/null +++ b/test/test_resource_remote_info_grafana_dashboard.py @@ -0,0 +1,53 @@ +# coding: utf-8 + +""" + Opal API + + The Opal API is a RESTful API that allows you to interact with the Opal Security platform programmatically. + + The version of the OpenAPI document: 1.0 + Contact: hello@opal.dev + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest + +from opal_security.models.resource_remote_info_grafana_dashboard import ResourceRemoteInfoGrafanaDashboard + +class TestResourceRemoteInfoGrafanaDashboard(unittest.TestCase): + """ResourceRemoteInfoGrafanaDashboard unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> ResourceRemoteInfoGrafanaDashboard: + """Test ResourceRemoteInfoGrafanaDashboard + include_optional is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `ResourceRemoteInfoGrafanaDashboard` + """ + model = ResourceRemoteInfoGrafanaDashboard() + if include_optional: + return ResourceRemoteInfoGrafanaDashboard( + dashboard_uid = 'dddRTXX' + ) + else: + return ResourceRemoteInfoGrafanaDashboard( + dashboard_uid = 'dddRTXX', + ) + """ + + def testResourceRemoteInfoGrafanaDashboard(self): + """Test ResourceRemoteInfoGrafanaDashboard""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_resource_remote_info_grafana_folder.py b/test/test_resource_remote_info_grafana_folder.py new file mode 100644 index 0000000..84161ff --- /dev/null +++ b/test/test_resource_remote_info_grafana_folder.py @@ -0,0 +1,53 @@ +# coding: utf-8 + +""" + Opal API + + The Opal API is a RESTful API that allows you to interact with the Opal Security platform programmatically. + + The version of the OpenAPI document: 1.0 + Contact: hello@opal.dev + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest + +from opal_security.models.resource_remote_info_grafana_folder import ResourceRemoteInfoGrafanaFolder + +class TestResourceRemoteInfoGrafanaFolder(unittest.TestCase): + """ResourceRemoteInfoGrafanaFolder unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> ResourceRemoteInfoGrafanaFolder: + """Test ResourceRemoteInfoGrafanaFolder + include_optional is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `ResourceRemoteInfoGrafanaFolder` + """ + model = ResourceRemoteInfoGrafanaFolder() + if include_optional: + return ResourceRemoteInfoGrafanaFolder( + folder_uid = 'fffRTXX' + ) + else: + return ResourceRemoteInfoGrafanaFolder( + folder_uid = 'fffRTXX', + ) + """ + + def testResourceRemoteInfoGrafanaFolder(self): + """Test ResourceRemoteInfoGrafanaFolder""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_resource_remote_info_grafana_role.py b/test/test_resource_remote_info_grafana_role.py new file mode 100644 index 0000000..b2a2454 --- /dev/null +++ b/test/test_resource_remote_info_grafana_role.py @@ -0,0 +1,53 @@ +# coding: utf-8 + +""" + Opal API + + The Opal API is a RESTful API that allows you to interact with the Opal Security platform programmatically. + + The version of the OpenAPI document: 1.0 + Contact: hello@opal.dev + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest + +from opal_security.models.resource_remote_info_grafana_role import ResourceRemoteInfoGrafanaRole + +class TestResourceRemoteInfoGrafanaRole(unittest.TestCase): + """ResourceRemoteInfoGrafanaRole unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> ResourceRemoteInfoGrafanaRole: + """Test ResourceRemoteInfoGrafanaRole + include_optional is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `ResourceRemoteInfoGrafanaRole` + """ + model = ResourceRemoteInfoGrafanaRole() + if include_optional: + return ResourceRemoteInfoGrafanaRole( + role_uid = 'rrfRTXX' + ) + else: + return ResourceRemoteInfoGrafanaRole( + role_uid = 'rrfRTXX', + ) + """ + + def testResourceRemoteInfoGrafanaRole(self): + """Test ResourceRemoteInfoGrafanaRole""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main()