Skip to content

Commit fc7b842

Browse files
committed
Add an external id to provider accounts so that they may be joined against external data sources
1 parent def7797 commit fc7b842

4 files changed

Lines changed: 32 additions & 22 deletions

File tree

introspector/aws/__init__.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ def get_boto_session() -> boto.Session:
3030
return session
3131

3232

33-
def _create_provider_and_credential(db: Session, proxy: Proxy,
34-
identity) -> ProviderAccount:
33+
def _create_provider_and_credential(
34+
db: Session, proxy: Proxy, identity,
35+
external_id: Optional[int]) -> ProviderAccount:
3536
account_id = identity['Account']
3637
org = proxy.service('organizations')
3738
try:
@@ -43,7 +44,9 @@ def _create_provider_and_credential(db: Session, proxy: Proxy,
4344
org_id = f'OrgDummy:{account_id}'
4445
else:
4546
raise
46-
provider = ProviderAccount(provider='aws', name=org_id)
47+
provider = ProviderAccount(provider='aws',
48+
name=org_id,
49+
external_id=external_id)
4750
db.add(provider)
4851
db.flush()
4952
_require_credential(db, provider.id, identity)
@@ -87,18 +90,20 @@ def walk_graph(org, graph) -> Generator[Tuple[str, str, Dict], None, None]:
8790

8891

8992
def build_aws_import_job(db: Session, session: boto.Session,
90-
confirm: ConfirmAcct) -> ImportJob:
93+
confirm: ConfirmAcct,
94+
external_id: Optional[int]) -> ImportJob:
9195
proxy = Proxy.build(session)
9296
sts = session.create_client('sts')
9397
identity = sts.get_caller_identity()
94-
provider = _get_or_create_provider(db, proxy, identity, confirm)
98+
provider = _get_or_create_provider(db, proxy, identity, confirm, external_id)
9599
desc = _build_import_job_desc(proxy, identity)
96100
org_id = desc['aws_org']['Id']
97101
return ImportJob.create(provider, desc, org_id)
98102

99103

100104
def _get_or_create_provider(db: Session, proxy: Proxy, identity: Dict,
101-
confirm: ConfirmAcct) -> ProviderAccount:
105+
confirm: ConfirmAcct,
106+
external_id: Optional[int]) -> ProviderAccount:
102107
org = proxy.service('organizations')
103108
try:
104109
org_resp = org.get('describe_organization')['Organization']
@@ -118,7 +123,7 @@ def _get_or_create_provider(db: Session, proxy: Proxy, identity: Dict,
118123
add = confirm(identity)
119124
if not add:
120125
raise GFError('User cancelled')
121-
return _create_provider_and_credential(db, proxy, identity)
126+
return _create_provider_and_credential(db, proxy, identity, external_id)
122127

123128

124129
def _build_import_job_desc(proxy: Proxy, identity: Dict) -> Dict:

introspector/cli/account/aws.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,18 @@ def cmd():
5858
is_flag=True,
5959
required=False,
6060
help='Set this flag to import a govcloud account')
61+
@click.option(
62+
'-e',
63+
'--external_id',
64+
default=None,
65+
required=False,
66+
type=int,
67+
help=
68+
'''Optional identifier to include in the provider_account row to facilitate joining against other data sources'''
69+
)
6170
@click.option('--dry-run', 'dry_run', default=False, hidden=True, is_flag=True)
62-
def import_aws_cmd(debug: bool, force: bool, dry_run: bool,
63-
service: Optional[str], gov_cloud: bool):
71+
def import_aws_cmd(debug: bool, force: bool, external_id: Optional[int],
72+
dry_run: bool, service: Optional[str], gov_cloud: bool):
6473
partition = 'aws-us-gov' if gov_cloud else 'aws'
6574
os.environ[
6675
'AWS_DEFAULT_REGION'] = 'us-gov-east-1' if gov_cloud else 'us-east-2'
@@ -77,7 +86,7 @@ def _confirm(identity: Dict) -> bool:
7786
default='yes')
7887

7988
confirm = _confirm
80-
import_job = build_aws_import_job(db, boto, confirm)
89+
import_job = build_aws_import_job(db, boto, confirm, external_id)
8190
db.add(import_job)
8291
db.flush()
8392
region_cache = RegionCache(boto, partition)

introspector/models/provider_account.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,9 @@ class ProviderAccount(Base):
1414
name = Column(String(256), comment='Provider name.')
1515
provider = Column(Enum('aws', 'gcp', 'azure', name='provider'),
1616
comment='Provider enum.')
17-
18-
@classmethod
19-
def get_or_create(cls, session: Session, account_info):
20-
provider = account_info['provider']
21-
account_id = account_info['account_id']
22-
provider_account = session.query(ProviderAccount).filter(
23-
ProviderAccount.provider == provider,
24-
ProviderAccount.name == account_id).one_or_none()
25-
if provider_account is None:
26-
provider_account = ProviderAccount(provider=provider, name=account_id)
27-
session.add(provider_account)
28-
return provider_account
17+
external_id = Column(
18+
Integer,
19+
comment='Optional external id for joining against external data sources')
2920

3021
@classmethod
3122
def all(cls,
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-- migrate:up
2+
ALTER TABLE provider_account ADD COLUMN external_id INTEGER;
3+
4+
-- migrate:down
5+
ALTER TABLE provider_account DROP COLUMN external_id;

0 commit comments

Comments
 (0)