Skip to content

Commit e3746ff

Browse files
authored
feat(jira): return projects in test_connection (#8634)
1 parent 9ac1248 commit e3746ff

File tree

3 files changed

+166
-84
lines changed

3 files changed

+166
-84
lines changed

prowler/CHANGELOG.md

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,8 @@ All notable changes to the **Prowler SDK** are documented in this file.
55

66
### Added
77
- Get Jira Project's metadata [(#8630)](https://github.com/prowler-cloud/prowler/pull/8630)
8-
9-
10-
### Changed
11-
12-
### Fixed
13-
14-
---
15-
16-
## [v5.11.1] (Prowler UNRELEASED)
17-
18-
### Fixed
19-
20-
---
21-
22-
## [v5.12.0] (Prowler UNRELEASED)
23-
24-
### Added
258
- Add more fields for the Jira ticket and handle custom fields errors [(#8601)](https://github.com/prowler-cloud/prowler/pull/8601)
9+
- Get Jira projects from test_connection [(#8634)](https://github.com/prowler-cloud/prowler/pull/8634)
2610

2711
### Changed
2812

prowler/lib/outputs/jira/jira.py

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import base64
22
import os
3+
from dataclasses import dataclass
34
from datetime import datetime, timedelta
45
from typing import Dict
56

@@ -35,6 +36,17 @@
3536
from prowler.providers.common.models import Connection
3637

3738

39+
@dataclass
40+
class JiraConnection(Connection):
41+
"""
42+
Represents a Jira connection object.
43+
Attributes:
44+
projects (dict): Dictionary of projects in Jira.
45+
"""
46+
47+
projects: dict = None
48+
49+
3850
class Jira:
3951
"""
4052
Jira class to interact with the Jira API
@@ -463,7 +475,7 @@ def test_connection(
463475
api_token: str = None,
464476
domain: str = None,
465477
raise_on_exception: bool = True,
466-
) -> Connection:
478+
) -> JiraConnection:
467479
"""Test the connection to Jira
468480
469481
Args:
@@ -476,14 +488,16 @@ def test_connection(
476488
- raise_on_exception: Whether to raise an exception or not
477489
478490
Returns:
479-
- Connection: The connection object
491+
- JiraConnection: The connection object
480492
481493
Raises:
482494
- JiraGetCloudIDNoResourcesError: No resources were found in Jira when getting the cloud id
483495
- JiraGetCloudIDResponseError: Failed to get the cloud ID, response code did not match 200
484496
- JiraGetCloudIDError: Failed to get the cloud ID from Jira
485497
- JiraAuthenticationError: Failed to authenticate
486498
- JiraTestConnectionError: Failed to test the connection
499+
- JiraNoProjectsError: No projects found in Jira
500+
- JiraGetProjectsResponseError: Failed to get projects from Jira, response code did not match 200
487501
"""
488502
try:
489503
jira = Jira(
@@ -494,68 +508,59 @@ def test_connection(
494508
api_token=api_token,
495509
domain=domain,
496510
)
497-
access_token = jira.get_access_token()
498-
499-
if not access_token:
500-
return ValueError("Failed to get access token")
501-
502-
if jira.using_basic_auth:
503-
headers = {"Authorization": f"Basic {access_token}"}
504-
else:
505-
headers = {"Authorization": f"Bearer {access_token}"}
506-
507-
response = requests.get(
508-
f"https://api.atlassian.com/ex/jira/{jira.cloud_id}/rest/api/3/myself",
509-
headers=headers,
510-
)
511+
projects = jira.get_projects()
511512

512-
if response.status_code == 200:
513-
return Connection(is_connected=True)
514-
else:
515-
return Connection(is_connected=False, error=response.json())
516-
except JiraGetCloudIDNoResourcesError as no_resources_error:
513+
return JiraConnection(is_connected=True, projects=projects)
514+
except JiraNoProjectsError as no_projects_error:
517515
logger.error(
518-
f"{no_resources_error.__class__.__name__}[{no_resources_error.__traceback__.tb_lineno}]: {no_resources_error}"
516+
f"{no_projects_error.__class__.__name__}[{no_projects_error.__traceback__.tb_lineno}]: {no_projects_error}"
519517
)
520518
if raise_on_exception:
521-
raise no_resources_error
522-
return Connection(error=no_resources_error)
519+
raise no_projects_error
520+
return JiraConnection(error=no_projects_error)
523521
except JiraGetCloudIDResponseError as response_error:
524522
logger.error(
525523
f"{response_error.__class__.__name__}[{response_error.__traceback__.tb_lineno}]: {response_error}"
526524
)
527525
if raise_on_exception:
528526
raise response_error
529-
return Connection(error=response_error)
527+
return JiraConnection(error=response_error)
530528
except JiraGetCloudIDError as cloud_id_error:
531529
logger.error(
532530
f"{cloud_id_error.__class__.__name__}[{cloud_id_error.__traceback__.tb_lineno}]: {cloud_id_error}"
533531
)
534532
if raise_on_exception:
535533
raise cloud_id_error
536-
return Connection(error=cloud_id_error)
534+
return JiraConnection(error=cloud_id_error)
537535
except JiraAuthenticationError as auth_error:
538536
logger.error(
539537
f"{auth_error.__class__.__name__}[{auth_error.__traceback__.tb_lineno}]: {auth_error}"
540538
)
541539
if raise_on_exception:
542540
raise auth_error
543-
return Connection(error=auth_error)
541+
return JiraConnection(error=auth_error)
544542
except JiraBasicAuthError as basic_auth_error:
545543
logger.error(
546544
f"{basic_auth_error.__class__.__name__}[{basic_auth_error.__traceback__.tb_lineno}]: {basic_auth_error}"
547545
)
548546
if raise_on_exception:
549547
raise basic_auth_error
550-
return Connection(error=basic_auth_error)
548+
return JiraConnection(error=basic_auth_error)
549+
except JiraGetProjectsResponseError as projects_response_error:
550+
logger.error(
551+
f"{projects_response_error.__class__.__name__}[{projects_response_error.__traceback__.tb_lineno}]: {projects_response_error}"
552+
)
553+
if raise_on_exception:
554+
raise projects_response_error
555+
return JiraConnection(error=projects_response_error)
551556
except Exception as error:
552557
logger.error(f"Failed to test connection: {error}")
553558
if raise_on_exception:
554559
raise JiraTestConnectionError(
555560
message="Failed to test connection on the Jira integration",
556561
file=os.path.basename(__file__),
557562
)
558-
return Connection(is_connected=False, error=error)
563+
return JiraConnection(is_connected=False, error=error)
559564

560565
def get_projects(self) -> Dict[str, str]:
561566
"""Get the projects from Jira

0 commit comments

Comments
 (0)