Skip to content

Commit e9cf5b7

Browse files
committed
Add resource_group_id as an optional parameter to the create_integration_instance method.
1 parent 859a109 commit e9cf5b7

File tree

5 files changed

+258
-0
lines changed

5 files changed

+258
-0
lines changed

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,23 @@ j1.fetch_entity_raw_data(entity_id='<id-of-entity>')
163163
##### Create Integration Instance
164164

165165
```python
166+
# Basic integration instance creation
166167
j1.create_integration_instance(
167168
instance_name="Integration Name",
168169
instance_description="Description Text")
170+
171+
# Create integration instance with resource group assignment
172+
j1.create_integration_instance(
173+
instance_name="Integration Name",
174+
instance_description="Description Text",
175+
resource_group_id="your-resource-group-id")
176+
177+
# Create integration instance with custom definition and resource group
178+
j1.create_integration_instance(
179+
instance_name="Integration Name",
180+
instance_description="Description Text",
181+
integration_definition_id="your-integration-definition-id",
182+
resource_group_id="your-resource-group-id")
169183
```
170184

171185
##### Start Synchronization Job
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
"""
2+
Example: Creating Integration Instances with Resource Group Support
3+
4+
This example demonstrates how to use the create_integration_instance method
5+
with the new resource_group_id parameter to assign integration instances
6+
to specific resource groups.
7+
"""
8+
9+
from jupiterone.client import JupiterOneClient
10+
import os
11+
12+
13+
def main():
14+
"""Example of creating integration instances with resource group support"""
15+
16+
# Initialize the JupiterOne client
17+
# You can set these as environment variables or pass them directly
18+
account = os.getenv('JUPITERONE_ACCOUNT')
19+
token = os.getenv('JUPITERONE_API_TOKEN')
20+
21+
if not account or not token:
22+
print("Please set JUPITERONE_ACCOUNT and JUPITERONE_API_TOKEN environment variables")
23+
return
24+
25+
j1_client = JupiterOneClient(account=account, token=token)
26+
27+
# Example 1: Create integration instance without resource group
28+
print("Creating integration instance without resource group...")
29+
try:
30+
integration = j1_client.create_integration_instance(
31+
instance_name="my-integration-no-rg",
32+
instance_description="Integration without resource group assignment"
33+
)
34+
print(f"Created integration instance: {integration['id']}")
35+
print(f"Name: {integration['name']}")
36+
print(f"Description: {integration['description']}")
37+
except Exception as e:
38+
print(f"Error creating integration instance: {e}")
39+
40+
print("\n" + "="*50 + "\n")
41+
42+
# Example 2: Create integration instance with resource group
43+
print("Creating integration instance with resource group...")
44+
try:
45+
integration_with_rg = j1_client.create_integration_instance(
46+
instance_name="my-integration-with-rg",
47+
instance_description="Integration with resource group assignment",
48+
resource_group_id="your-resource-group-id-here" # Replace with actual resource group ID
49+
)
50+
print(f"Created integration instance: {integration_with_rg['id']}")
51+
print(f"Name: {integration_with_rg['name']}")
52+
print(f"Description: {integration_with_rg['description']}")
53+
print(f"Resource Group ID: {integration_with_rg.get('resourceGroupId', 'Not assigned')}")
54+
except Exception as e:
55+
print(f"Error creating integration instance with resource group: {e}")
56+
57+
print("\n" + "="*50 + "\n")
58+
59+
# Example 3: Create integration instance with custom definition and resource group
60+
print("Creating integration instance with custom definition and resource group...")
61+
try:
62+
integration_custom = j1_client.create_integration_instance(
63+
instance_name="my-custom-integration",
64+
instance_description="Custom integration with resource group",
65+
integration_definition_id="your-integration-definition-id-here", # Replace with actual definition ID
66+
resource_group_id="your-resource-group-id-here" # Replace with actual resource group ID
67+
)
68+
print(f"Created custom integration instance: {integration_custom['id']}")
69+
print(f"Name: {integration_custom['name']}")
70+
print(f"Description: {integration_custom['description']}")
71+
print(f"Integration Definition ID: {integration_custom.get('integrationDefinitionId')}")
72+
print(f"Resource Group ID: {integration_custom.get('resourceGroupId', 'Not assigned')}")
73+
except Exception as e:
74+
print(f"Error creating custom integration instance: {e}")
75+
76+
77+
if __name__ == "__main__":
78+
main()

jupiterone/client.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,7 @@ def create_integration_instance(
574574
instance_name: str = None,
575575
instance_description: str = None,
576576
integration_definition_id: str = "8013680b-311a-4c2e-b53b-c8735fd97a5c",
577+
resource_group_id: str = None,
577578
):
578579
"""Creates a new Custom Integration Instance.
579580
@@ -582,6 +583,8 @@ def create_integration_instance(
582583
instance_description (str): The "Description" for integration instance
583584
integration_definition_id (str): The "Integration definition ID" for integration instance,
584585
if no parameter is passed, then the Custom Integration definition ID will be used.
586+
resource_group_id (str): The "Resource Group ID" for integration instance,
587+
if provided, the integration instance will be assigned to the specified resource group.
585588
"""
586589
variables = {
587590
"instance": {
@@ -595,6 +598,9 @@ def create_integration_instance(
595598
}
596599
}
597600

601+
if resource_group_id:
602+
variables["instance"]["resourceGroupId"] = resource_group_id
603+
598604
response = self._execute_query(CREATE_INSTANCE, variables=variables)
599605
return response["data"]["createIntegrationInstance"]
600606

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
"""Test create_integration_instance method"""
2+
3+
import pytest
4+
from unittest.mock import Mock, patch
5+
from jupiterone.client import JupiterOneClient
6+
7+
8+
class TestCreateIntegrationInstance:
9+
"""Test create_integration_instance method"""
10+
11+
def setup_method(self):
12+
"""Set up test fixtures"""
13+
self.client = JupiterOneClient(account="test-account", token="test-token")
14+
15+
@patch('jupiterone.client.JupiterOneClient._execute_query')
16+
def test_create_integration_instance_basic(self, mock_execute_query):
17+
"""Test basic integration instance creation without resource_group_id"""
18+
# Mock response
19+
mock_response = {
20+
"data": {
21+
"createIntegrationInstance": {
22+
"id": "test-instance-id",
23+
"name": "test-instance",
24+
"description": "Test integration instance"
25+
}
26+
}
27+
}
28+
mock_execute_query.return_value = mock_response
29+
30+
# Test the method
31+
result = self.client.create_integration_instance(
32+
instance_name="test-instance",
33+
instance_description="Test integration instance"
34+
)
35+
36+
# Verify the result
37+
assert result == mock_response["data"]["createIntegrationInstance"]
38+
39+
# Verify the query was called with correct variables
40+
mock_execute_query.assert_called_once()
41+
call_args = mock_execute_query.call_args
42+
variables = call_args[1]['variables']
43+
44+
assert variables["instance"]["name"] == "test-instance"
45+
assert variables["instance"]["description"] == "Test integration instance"
46+
assert "resourceGroupId" not in variables["instance"]
47+
48+
@patch('jupiterone.client.JupiterOneClient._execute_query')
49+
def test_create_integration_instance_with_resource_group_id(self, mock_execute_query):
50+
"""Test integration instance creation with resource_group_id"""
51+
# Mock response
52+
mock_response = {
53+
"data": {
54+
"createIntegrationInstance": {
55+
"id": "test-instance-id",
56+
"name": "test-instance",
57+
"description": "Test integration instance",
58+
"resourceGroupId": "test-resource-group-id"
59+
}
60+
}
61+
}
62+
mock_execute_query.return_value = mock_response
63+
64+
# Test the method with resource_group_id
65+
result = self.client.create_integration_instance(
66+
instance_name="test-instance",
67+
instance_description="Test integration instance",
68+
resource_group_id="test-resource-group-id"
69+
)
70+
71+
# Verify the result
72+
assert result == mock_response["data"]["createIntegrationInstance"]
73+
74+
# Verify the query was called with correct variables including resourceGroupId
75+
mock_execute_query.assert_called_once()
76+
call_args = mock_execute_query.call_args
77+
variables = call_args[1]['variables']
78+
79+
assert variables["instance"]["name"] == "test-instance"
80+
assert variables["instance"]["description"] == "Test integration instance"
81+
assert variables["instance"]["resourceGroupId"] == "test-resource-group-id"
82+
83+
@patch('jupiterone.client.JupiterOneClient._execute_query')
84+
def test_create_integration_instance_with_custom_definition_id(self, mock_execute_query):
85+
"""Test integration instance creation with custom definition ID"""
86+
# Mock response
87+
mock_response = {
88+
"data": {
89+
"createIntegrationInstance": {
90+
"id": "test-instance-id",
91+
"name": "test-instance",
92+
"integrationDefinitionId": "custom-definition-id"
93+
}
94+
}
95+
}
96+
mock_execute_query.return_value = mock_response
97+
98+
# Test the method with custom definition ID
99+
result = self.client.create_integration_instance(
100+
instance_name="test-instance",
101+
integration_definition_id="custom-definition-id"
102+
)
103+
104+
# Verify the result
105+
assert result == mock_response["data"]["createIntegrationInstance"]
106+
107+
# Verify the query was called with correct variables
108+
mock_execute_query.assert_called_once()
109+
call_args = mock_execute_query.call_args
110+
variables = call_args[1]['variables']
111+
112+
assert variables["instance"]["integrationDefinitionId"] == "custom-definition-id"
113+
114+
@patch('jupiterone.client.JupiterOneClient._execute_query')
115+
def test_create_integration_instance_all_parameters(self, mock_execute_query):
116+
"""Test integration instance creation with all parameters"""
117+
# Mock response
118+
mock_response = {
119+
"data": {
120+
"createIntegrationInstance": {
121+
"id": "test-instance-id",
122+
"name": "test-instance",
123+
"description": "Test integration instance",
124+
"integrationDefinitionId": "custom-definition-id",
125+
"resourceGroupId": "test-resource-group-id"
126+
}
127+
}
128+
}
129+
mock_execute_query.return_value = mock_response
130+
131+
# Test the method with all parameters
132+
result = self.client.create_integration_instance(
133+
instance_name="test-instance",
134+
instance_description="Test integration instance",
135+
integration_definition_id="custom-definition-id",
136+
resource_group_id="test-resource-group-id"
137+
)
138+
139+
# Verify the result
140+
assert result == mock_response["data"]["createIntegrationInstance"]
141+
142+
# Verify the query was called with correct variables
143+
mock_execute_query.assert_called_once()
144+
call_args = mock_execute_query.call_args
145+
variables = call_args[1]['variables']
146+
147+
assert variables["instance"]["name"] == "test-instance"
148+
assert variables["instance"]["description"] == "Test integration instance"
149+
assert variables["instance"]["integrationDefinitionId"] == "custom-definition-id"
150+
assert variables["instance"]["resourceGroupId"] == "test-resource-group-id"
151+
assert variables["instance"]["pollingInterval"] == "DISABLED"
152+
assert "config" in variables["instance"]
153+
assert "pollingIntervalCronExpression" in variables["instance"]
154+
assert "ingestionSourcesOverrides" in variables["instance"]

tests/test_query.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import pytest
33
import responses
44
from collections import Counter
5+
from requests.adapters import HTTPAdapter
6+
from urllib3.util.retry import Retry
57

68
from jupiterone.client import JupiterOneClient
79
from jupiterone.constants import QUERY_V1
@@ -411,7 +413,11 @@ def test_bad_gateway_error_query_v1():
411413
content_type='application/json',
412414
)
413415

416+
# Create a client without retry logic to test 502 error handling
414417
j1 = JupiterOneClient(account='testAccount', token='bogusToken')
418+
# Disable retries for this test by setting total=0
419+
j1.session.mount("https://", HTTPAdapter(max_retries=Retry(total=0)))
420+
415421
query = "find Host with _id='1' return tree"
416422

417423
with pytest.raises(JupiterOneApiError) as exc_info:

0 commit comments

Comments
 (0)