Skip to content

Commit e28fa42

Browse files
authored
Updates for Lacework v3.90 (#17)
* fix: 'CloudTrail' endpoint was renamed to 'CloudActivities' * fix: 'REMOTE_SCANNER' registry type changed to 'INLINE_SCANNER' * docs: Updated README.md for newer APIv2 endpoints * feat: Implemented the 'account' endpoint
1 parent c3a9d1e commit e28fa42

File tree

8 files changed

+103
-30
lines changed

8 files changed

+103
-30
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ Are you looking for some sample scripts? Check out the [examples](examples/) fol
7777

7878
### API v1
7979

80+
- [x] Account API
8081
- [x] Compliance API
8182
- [x] Custom Compliance Config API
8283
- [x] Download File API
@@ -93,8 +94,12 @@ Are you looking for some sample scripts? Check out the [examples](examples/) fol
9394
- [x] Alert Channels
9495
- [x] Alert Rules
9596
- [x] Audit Logs
96-
- [x] CloudTrail
97+
- [x] Cloud Accounts
98+
- [x] Cloud Activities
99+
- [x] Container Registries
97100
- [x] Contract Info
98101
- [x] Report Rules
99102
- [x] Resource Groups
103+
- [x] Schemas
100104
- [x] Team Members
105+
- [x] User Profile

laceworksdk/api/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77

88
from dotenv import load_dotenv
99
from laceworksdk.http_session import HttpSession
10+
from .account import AccountAPI
1011
from .agent_access_tokens import AgentAccessTokensAPI
1112
from .alert_channels import AlertChannelsAPI
1213
from .alert_rules import AlertRulesAPI
1314
from .audit_logs import AuditLogsAPI
1415
from .cloud_accounts import CloudAccountsAPI
15-
from .cloudtrail import CloudTrailAPI
16+
from .cloud_activities import CloudActivitiesAPI
1617
from .compliance import ComplianceAPI
1718
from .container_registries import ContainerRegistriesAPI
1819
from .contract_info import ContractInfoAPI
@@ -75,12 +76,13 @@ def __init__(self,
7576
)
7677

7778
# API Wrappers
79+
self.account = AccountAPI(self._session)
7880
self.agent_access_tokens = AgentAccessTokensAPI(self._session)
7981
self.alert_channels = AlertChannelsAPI(self._session)
8082
self.alert_rules = AlertRulesAPI(self._session)
8183
self.audit_logs = AuditLogsAPI(self._session)
8284
self.cloud_accounts = CloudAccountsAPI(self._session)
83-
self.cloudtrail = CloudTrailAPI(self._session)
85+
self.cloud_activities = CloudActivitiesAPI(self._session)
8486
self.compliance = ComplianceAPI(self._session)
8587
self.compliance.config = CustomComplianceConfigAPI(self._session)
8688
self.container_registries = ContainerRegistriesAPI(self._session)

laceworksdk/api/account.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# -*- coding: utf-8 -*-
2+
"""
3+
Lacework Account API wrapper.
4+
"""
5+
6+
import logging
7+
8+
logger = logging.getLogger(__name__)
9+
10+
11+
class AccountAPI(object):
12+
"""
13+
Lacework Account API.
14+
"""
15+
16+
def __init__(self, session):
17+
"""
18+
Initializes the AccountAPI object.
19+
20+
:param session: An instance of the HttpSession class.
21+
22+
:return AccountAPI object
23+
"""
24+
25+
super(AccountAPI, self).__init__()
26+
27+
self._session = session
28+
29+
def get_org_info(self):
30+
"""
31+
A method to get Account's organization info
32+
33+
:return response json
34+
"""
35+
36+
logger.info("Getting Account information from Lacework...")
37+
38+
# Build the Account request URI
39+
api_uri = "/api/v1/external/account/organizationInfo"
40+
41+
response = self._session.get(api_uri)
42+
43+
return response.json()

laceworksdk/api/cloudtrail.py renamed to laceworksdk/api/cloud_activities.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
# -*- coding: utf-8 -*-
22
"""
3-
Lacework CloudTrail API wrapper.
3+
Lacework CloudActivities API wrapper.
44
"""
55

66
import logging
77

88
logger = logging.getLogger(__name__)
99

1010

11-
class CloudTrailAPI(object):
11+
class CloudActivitiesAPI(object):
1212
"""
13-
Lacework CloudTrail API.
13+
Lacework CloudActivities API.
1414
"""
1515

1616
def __init__(self, session):
1717
"""
18-
Initializes the CloudTrailAPI object.
18+
Initializes the CloudActivitiesAPI object.
1919
2020
:param session: An instance of the HttpSession class
2121
22-
:return CloudTrailAPI object.
22+
:return CloudActivitiesAPI object.
2323
"""
2424

25-
super(CloudTrailAPI, self).__init__()
25+
super(CloudActivitiesAPI, self).__init__()
2626

2727
self._session = session
2828

@@ -31,7 +31,7 @@ def get(self,
3131
end_time=None,
3232
org=False):
3333
"""
34-
A method to get CloudTrail details.
34+
A method to get CloudActivities details.
3535
3636
:param start_time: A "%Y-%m-%dT%H:%M:%SZ" structured timestamp to begin from.
3737
:param end_time: A "%Y-%m-%dT%H:%M:%S%Z" structured timestamp to end at.
@@ -41,10 +41,10 @@ def get(self,
4141
:return response json
4242
"""
4343

44-
logger.info("Getting CloudTrail details from Lacework...")
44+
logger.info("Getting CloudActivities details from Lacework...")
4545

46-
# Build the CloudTrail request URI
47-
api_uri = "/api/v2/CloudTrail"
46+
# Build the CloudActivities request URI
47+
api_uri = "/api/v2/CloudActivities"
4848

4949
if start_time and end_time:
5050
api_uri += f"?startTime={start_time}&endTime={end_time}"
@@ -57,7 +57,7 @@ def search(self,
5757
query_data=None,
5858
org=False):
5959
"""
60-
A method to search CloudTrail details.
60+
A method to search CloudActivities details.
6161
6262
:param query_data: A dictionary containing the necessary search parameters
6363
(timeFilter, filters, returns)
@@ -67,10 +67,10 @@ def search(self,
6767
:return response json
6868
"""
6969

70-
logger.info("Searching CloudTrail details from Lacework...")
70+
logger.info("Searching CloudActivities details from Lacework...")
7171

72-
# Build the CloudTrail request URI
73-
api_uri = "/api/v2/CloudTrail/search"
72+
# Build the CloudActivities request URI
73+
api_uri = "/api/v2/CloudActivities/search"
7474

7575
response = self._session.post(api_uri, data=query_data, org=org)
7676

tests/api/test_account.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# -*- coding: utf-8 -*-
2+
"""
3+
Test suite for the community-developed Python SDK for interacting with Lacework APIs.
4+
"""
5+
6+
from laceworksdk.api.account import AccountAPI
7+
8+
9+
# Tests
10+
11+
def test_account_api_object_creation(api):
12+
assert isinstance(api.account, AccountAPI)
13+
14+
15+
def test_account_api_env_object_creation(api_env):
16+
assert isinstance(api_env.account, AccountAPI)
17+
18+
19+
def test_account_api_get_org_info(api):
20+
response = api.account.get_org_info()
21+
assert "orgAccount" in response.keys()
22+
assert "orgAccountName" in response.keys()

tests/api/test_cloudtrail.py renamed to tests/api/test_cloud_activities.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from datetime import datetime, timedelta, timezone
77

8-
from laceworksdk.api.cloudtrail import CloudTrailAPI
8+
from laceworksdk.api.cloud_activities import CloudActivitiesAPI
99

1010
# Build start/end times
1111
current_time = datetime.now(timezone.utc)
@@ -16,26 +16,26 @@
1616

1717
# Tests
1818

19-
def test_cloud_trail_api_object_creation(api):
20-
assert isinstance(api.cloudtrail, CloudTrailAPI)
19+
def test_cloud_activities_api_object_creation(api):
20+
assert isinstance(api.cloud_activities, CloudActivitiesAPI)
2121

2222

23-
def test_cloud_trail_api_env_object_creation(api_env):
24-
assert isinstance(api_env.cloudtrail, CloudTrailAPI)
23+
def test_cloud_activities_api_env_object_creation(api_env):
24+
assert isinstance(api_env.cloud_activities, CloudActivitiesAPI)
2525

2626

27-
def test_cloud_trail_api_get(api):
28-
response = api.cloudtrail.get()
27+
def test_cloud_activities_api_get(api):
28+
response = api.cloud_activities.get()
2929
assert "data" in response.keys()
3030

3131

32-
def test_cloud_trail_api_get_by_date(api):
33-
response = api.cloudtrail.get(start_time=start_time, end_time=end_time)
32+
def test_cloud_activities_api_get_by_date(api):
33+
response = api.cloud_activities.get(start_time=start_time, end_time=end_time)
3434
assert "data" in response.keys()
3535

3636

37-
def test_cloud_trail_api_search(api):
38-
response = api.cloudtrail.search(query_data={
37+
def test_cloud_activities_api_search(api):
38+
response = api.cloud_activities.search(query_data={
3939
"timeFilter": {
4040
"startTime": start_time,
4141
"endTime": end_time

tests/api/test_container_registries.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def test_container_registries_api_create(api):
4444
type="ContVulnCfg",
4545
enabled=1,
4646
data={
47-
"registryType": "REMOTE_SCANNER"
47+
"registryType": "INLINE_SCANNER"
4848
}
4949
)
5050

tests/conftest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
pytest_plugins = [
77
"tests.test_laceworksdk",
88
"tests.api",
9+
"tests.api.test_account",
910
"tests.api.test_agent_access_tokens",
1011
"tests.api.test_alert_channels",
1112
"tests.api.test_alert_rules",
1213
"tests.api.test_audit_logs",
1314
"tests.api.test_cloud_accounts",
14-
"tests.api.test_cloudtrail",
15+
"tests.api.test_cloud_activities",
1516
"tests.api.test_compliance",
1617
"tests.api.test_container_registries",
1718
"tests.api.test_contract_info",

0 commit comments

Comments
 (0)