Skip to content

Commit 4f15dd4

Browse files
feat: iac diff scan
1 parent 03cda35 commit 4f15dd4

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

pygitguardian/client.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,13 @@
1212
from requests import Response, Session, codes
1313

1414
from .config import DEFAULT_API_VERSION, DEFAULT_BASE_URI, DEFAULT_TIMEOUT
15-
from .iac_models import IaCScanParameters, IaCScanParametersSchema, IaCScanResult
15+
from .iac_models import (
16+
IaCDiffScanResult,
17+
IaCDiffScanResultSchema,
18+
IaCScanParameters,
19+
IaCScanParametersSchema,
20+
IaCScanResult,
21+
)
1622
from .models import (
1723
Detail,
1824
Document,
@@ -270,6 +276,7 @@ def post(
270276
**kwargs: Any,
271277
) -> Response:
272278
# Be aware that self.iac_directory_scan bypass this method and calls self.request directly.
279+
# self.iac_diff_scan also bypass this method
273280
return self.request(
274281
"post",
275282
endpoint=endpoint,
@@ -498,6 +505,41 @@ def iac_directory_scan(
498505

499506
return result
500507

508+
# For IaC diff Scans
509+
def iac_diff_scan(
510+
self,
511+
reference: bytes,
512+
current: bytes,
513+
scan_parameters: IaCScanParameters,
514+
extra_headers: Optional[Dict[str, str]] = None,
515+
) -> Union[Detail, IaCDiffScanResult]:
516+
result: Union[Detail, IaCDiffScanResult]
517+
try:
518+
# bypass self.post because data argument is needed in self.request and self.post use it as json
519+
resp = self.request(
520+
"post",
521+
endpoint="iac_diff_scan",
522+
extra_headers=extra_headers,
523+
files={
524+
"reference": reference,
525+
"current": current,
526+
},
527+
data={
528+
"scan_parameters": IaCScanParametersSchema().dumps(scan_parameters),
529+
},
530+
)
531+
except requests.exceptions.ReadTimeout:
532+
result = Detail("The request timed out.")
533+
result.status_code = 504
534+
else:
535+
if is_ok(resp):
536+
result = IaCDiffScanResultSchema.from_dict(resp.json()) # type: ignore
537+
else:
538+
result = load_detail(resp)
539+
540+
result.status_code = resp.status_code
541+
return result
542+
501543
def read_metadata(self) -> Optional[Detail]:
502544
"""
503545
Fetch server preferences and store them in `self.secret_scan_preferences`.

pygitguardian/iac_models.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,25 @@ class IaCScanResult(Base, FromDictMixin):
6363
Type[BaseSchema], marshmallow_dataclass.class_schema(IaCScanResult, BaseSchema)
6464
)
6565
IaCScanResult.SCHEMA = IaCScanResultSchema()
66+
67+
68+
@dataclass
69+
class IaCDiffScanEntities(Base):
70+
unchanged: List[IaCFileResult] = field(default_factory=list)
71+
new: List[IaCFileResult] = field(default_factory=list)
72+
deleted: List[IaCFileResult] = field(default_factory=list)
73+
74+
75+
@dataclass
76+
class IaCDiffScanResult(Base):
77+
id: str = ""
78+
type: str = ""
79+
iac_engine_version: str = ""
80+
entities_with_incidents: IaCDiffScanEntities = field(
81+
default_factory=IaCDiffScanEntities
82+
)
83+
84+
85+
IaCDiffScanResultSchema = marshmallow_dataclass.class_schema(
86+
IaCDiffScanResult, BaseSchema
87+
)

0 commit comments

Comments
 (0)