qontract-reconcile 0.10.2.dev345__py3-none-any.whl → 0.10.2.dev408__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {qontract_reconcile-0.10.2.dev345.dist-info → qontract_reconcile-0.10.2.dev408.dist-info}/METADATA +11 -10
- {qontract_reconcile-0.10.2.dev345.dist-info → qontract_reconcile-0.10.2.dev408.dist-info}/RECORD +126 -120
- reconcile/aus/base.py +17 -14
- reconcile/automated_actions/config/integration.py +12 -0
- reconcile/aws_account_manager/integration.py +2 -2
- reconcile/aws_ami_cleanup/integration.py +6 -7
- reconcile/aws_ami_share.py +69 -62
- reconcile/aws_cloudwatch_log_retention/integration.py +155 -126
- reconcile/aws_ecr_image_pull_secrets.py +2 -2
- reconcile/aws_iam_keys.py +1 -0
- reconcile/aws_saml_idp/integration.py +7 -1
- reconcile/aws_saml_roles/integration.py +9 -3
- reconcile/change_owners/change_owners.py +1 -1
- reconcile/change_owners/diff.py +2 -4
- reconcile/checkpoint.py +11 -3
- reconcile/cli.py +33 -8
- reconcile/dashdotdb_dora.py +4 -11
- reconcile/database_access_manager.py +118 -111
- reconcile/endpoints_discovery/integration.py +4 -1
- reconcile/endpoints_discovery/merge_request_manager.py +9 -11
- reconcile/external_resources/factories.py +5 -12
- reconcile/external_resources/integration.py +1 -1
- reconcile/external_resources/manager.py +5 -3
- reconcile/external_resources/meta.py +0 -1
- reconcile/external_resources/model.py +10 -10
- reconcile/external_resources/reconciler.py +5 -2
- reconcile/external_resources/secrets_sync.py +4 -6
- reconcile/external_resources/state.py +5 -4
- reconcile/gabi_authorized_users.py +8 -5
- reconcile/gitlab_housekeeping.py +13 -15
- reconcile/gitlab_mr_sqs_consumer.py +2 -2
- reconcile/gitlab_owners.py +15 -11
- reconcile/gql_definitions/automated_actions/instance.py +41 -2
- reconcile/gql_definitions/aws_ami_cleanup/aws_accounts.py +10 -0
- reconcile/gql_definitions/aws_cloudwatch_log_retention/aws_accounts.py +22 -61
- reconcile/gql_definitions/aws_saml_idp/aws_accounts.py +10 -0
- reconcile/gql_definitions/aws_saml_roles/aws_accounts.py +10 -0
- reconcile/gql_definitions/common/aws_vpc_requests.py +10 -0
- reconcile/gql_definitions/common/clusters.py +2 -0
- reconcile/gql_definitions/external_resources/external_resources_namespaces.py +84 -1
- reconcile/gql_definitions/external_resources/external_resources_settings.py +2 -0
- reconcile/gql_definitions/fragments/aws_account_common.py +2 -0
- reconcile/gql_definitions/fragments/aws_organization.py +33 -0
- reconcile/gql_definitions/fragments/aws_vpc_request.py +2 -0
- reconcile/gql_definitions/introspection.json +3474 -1986
- reconcile/gql_definitions/jira_permissions_validator/jira_boards_for_permissions_validator.py +4 -0
- reconcile/gql_definitions/terraform_init/aws_accounts.py +14 -0
- reconcile/gql_definitions/terraform_resources/terraform_resources_namespaces.py +33 -1
- reconcile/gql_definitions/terraform_tgw_attachments/aws_accounts.py +10 -0
- reconcile/jenkins_worker_fleets.py +1 -0
- reconcile/jira_permissions_validator.py +236 -121
- reconcile/ocm/types.py +6 -0
- reconcile/openshift_base.py +47 -1
- reconcile/openshift_cluster_bots.py +2 -1
- reconcile/openshift_resources_base.py +6 -2
- reconcile/openshift_saas_deploy.py +2 -2
- reconcile/openshift_saas_deploy_trigger_cleaner.py +3 -5
- reconcile/openshift_upgrade_watcher.py +3 -3
- reconcile/queries.py +131 -0
- reconcile/saas_auto_promotions_manager/subscriber.py +4 -3
- reconcile/slack_usergroups.py +4 -3
- reconcile/sql_query.py +1 -0
- reconcile/statuspage/integrations/maintenances.py +4 -3
- reconcile/statuspage/status.py +5 -8
- reconcile/templates/rosa-classic-cluster-creation.sh.j2 +4 -0
- reconcile/templates/rosa-hcp-cluster-creation.sh.j2 +3 -0
- reconcile/templating/renderer.py +2 -1
- reconcile/terraform_aws_route53.py +7 -1
- reconcile/terraform_init/integration.py +185 -21
- reconcile/terraform_resources.py +11 -1
- reconcile/terraform_tgw_attachments.py +7 -1
- reconcile/terraform_users.py +7 -0
- reconcile/terraform_vpc_peerings.py +14 -3
- reconcile/terraform_vpc_resources/integration.py +7 -0
- reconcile/typed_queries/aws_account_tags.py +41 -0
- reconcile/typed_queries/saas_files.py +2 -2
- reconcile/utils/aggregated_list.py +4 -3
- reconcile/utils/aws_api.py +51 -20
- reconcile/utils/aws_api_typed/api.py +38 -9
- reconcile/utils/aws_api_typed/cloudformation.py +149 -0
- reconcile/utils/aws_api_typed/logs.py +73 -0
- reconcile/utils/datetime_util.py +67 -0
- reconcile/utils/differ.py +2 -3
- reconcile/utils/early_exit_cache.py +3 -2
- reconcile/utils/expiration.py +7 -3
- reconcile/utils/external_resource_spec.py +24 -1
- reconcile/utils/filtering.py +1 -1
- reconcile/utils/helm.py +2 -1
- reconcile/utils/helpers.py +1 -1
- reconcile/utils/jinja2/utils.py +4 -96
- reconcile/utils/jira_client.py +82 -63
- reconcile/utils/jjb_client.py +9 -12
- reconcile/utils/jobcontroller/controller.py +1 -1
- reconcile/utils/jobcontroller/models.py +17 -1
- reconcile/utils/json.py +32 -0
- reconcile/utils/merge_request_manager/merge_request_manager.py +3 -3
- reconcile/utils/merge_request_manager/parser.py +2 -2
- reconcile/utils/mr/app_interface_reporter.py +2 -2
- reconcile/utils/mr/base.py +2 -2
- reconcile/utils/mr/notificator.py +2 -2
- reconcile/utils/mr/update_access_report_base.py +3 -4
- reconcile/utils/oc.py +113 -95
- reconcile/utils/oc_filters.py +3 -3
- reconcile/utils/ocm/products.py +6 -0
- reconcile/utils/ocm/search_filters.py +3 -6
- reconcile/utils/ocm/service_log.py +3 -5
- reconcile/utils/openshift_resource.py +10 -5
- reconcile/utils/output.py +3 -2
- reconcile/utils/pagerduty_api.py +5 -5
- reconcile/utils/runtime/integration.py +1 -2
- reconcile/utils/runtime/runner.py +2 -2
- reconcile/utils/saasherder/models.py +2 -1
- reconcile/utils/saasherder/saasherder.py +9 -7
- reconcile/utils/slack_api.py +24 -2
- reconcile/utils/sloth.py +171 -2
- reconcile/utils/sqs_gateway.py +2 -1
- reconcile/utils/state.py +2 -1
- reconcile/utils/terraform_client.py +4 -3
- reconcile/utils/terrascript_aws_client.py +165 -111
- reconcile/utils/vault.py +1 -1
- reconcile/vault_replication.py +107 -42
- tools/app_interface_reporter.py +4 -4
- tools/cli_commands/systems_and_tools.py +5 -1
- tools/qontract_cli.py +25 -13
- {qontract_reconcile-0.10.2.dev345.dist-info → qontract_reconcile-0.10.2.dev408.dist-info}/WHEEL +0 -0
- {qontract_reconcile-0.10.2.dev345.dist-info → qontract_reconcile-0.10.2.dev408.dist-info}/entry_points.txt +0 -0
reconcile/aus/base.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import datetime as dt
|
|
2
1
|
import logging
|
|
3
2
|
import sys
|
|
4
3
|
from abc import (
|
|
@@ -71,6 +70,12 @@ from reconcile.utils.clusterhealth.telemeter import (
|
|
|
71
70
|
TELEMETER_SOURCE,
|
|
72
71
|
TelemeterClusterHealthProvider,
|
|
73
72
|
)
|
|
73
|
+
from reconcile.utils.datetime_util import (
|
|
74
|
+
ensure_utc,
|
|
75
|
+
from_utc_iso_format,
|
|
76
|
+
to_utc_seconds_iso_format,
|
|
77
|
+
utc_now,
|
|
78
|
+
)
|
|
74
79
|
from reconcile.utils.defer import defer
|
|
75
80
|
from reconcile.utils.disabled_integrations import integration_is_enabled
|
|
76
81
|
from reconcile.utils.filtering import remove_none_values_from_dict
|
|
@@ -420,9 +425,9 @@ class AbstractUpgradePolicy(ABC, BaseModel):
|
|
|
420
425
|
|
|
421
426
|
|
|
422
427
|
def addon_upgrade_policy_soonest_next_run() -> str:
|
|
423
|
-
now =
|
|
428
|
+
now = utc_now()
|
|
424
429
|
next_run = now + timedelta(minutes=MIN_DELTA_MINUTES)
|
|
425
|
-
return next_run
|
|
430
|
+
return to_utc_seconds_iso_format(next_run)
|
|
426
431
|
|
|
427
432
|
|
|
428
433
|
class AddonUpgradePolicy(AbstractUpgradePolicy):
|
|
@@ -638,8 +643,8 @@ def update_history(
|
|
|
638
643
|
version_data (VersionData): version data, including history of soakdays
|
|
639
644
|
upgrade_policies (list): query results of clusters upgrade policies
|
|
640
645
|
"""
|
|
641
|
-
now =
|
|
642
|
-
check_in = version_data.check_in or now
|
|
646
|
+
now = utc_now()
|
|
647
|
+
check_in = ensure_utc(version_data.check_in or now)
|
|
643
648
|
|
|
644
649
|
# we iterate over clusters upgrade policies and update the version history
|
|
645
650
|
for spec in org_upgrade_spec.specs:
|
|
@@ -930,7 +935,7 @@ def verify_schedule_should_skip(
|
|
|
930
935
|
# immediately
|
|
931
936
|
delay_minutes = 1 if addon_id else MIN_DELTA_MINUTES
|
|
932
937
|
next_schedule = iter.get_next(
|
|
933
|
-
|
|
938
|
+
datetime, start_time=now + timedelta(minutes=delay_minutes)
|
|
934
939
|
)
|
|
935
940
|
next_schedule_in_seconds = (next_schedule - now).total_seconds()
|
|
936
941
|
next_schedule_in_hours = next_schedule_in_seconds / 3600 # seconds in hour
|
|
@@ -947,7 +952,7 @@ def verify_schedule_should_skip(
|
|
|
947
952
|
f"[{desired.org.org_id}/{desired.org.name}/{desired.cluster.name}] skipping cluster with no upcoming upgrade"
|
|
948
953
|
)
|
|
949
954
|
return None
|
|
950
|
-
return next_schedule
|
|
955
|
+
return to_utc_seconds_iso_format(next_schedule)
|
|
951
956
|
|
|
952
957
|
|
|
953
958
|
def verify_max_upgrades_should_skip(
|
|
@@ -1024,8 +1029,8 @@ def _calculate_node_pool_diffs(
|
|
|
1024
1029
|
) -> UpgradePolicyHandler | None:
|
|
1025
1030
|
for pool in spec.node_pools:
|
|
1026
1031
|
if parse_semver(pool.version).match(f"<{spec.current_version}"):
|
|
1027
|
-
next_schedule = (
|
|
1028
|
-
|
|
1032
|
+
next_schedule = to_utc_seconds_iso_format(
|
|
1033
|
+
now + timedelta(minutes=MIN_DELTA_MINUTES)
|
|
1029
1034
|
)
|
|
1030
1035
|
return UpgradePolicyHandler(
|
|
1031
1036
|
action="create",
|
|
@@ -1082,7 +1087,7 @@ def calculate_diff(
|
|
|
1082
1087
|
set_upgrading(spec.cluster.id, spec.effective_mutexes, sector_name)
|
|
1083
1088
|
|
|
1084
1089
|
addon_service = init_addon_service(desired_state.org.environment)
|
|
1085
|
-
now =
|
|
1090
|
+
now = utc_now()
|
|
1086
1091
|
gates = get_version_gates(ocm_api)
|
|
1087
1092
|
for spec in desired_state.specs:
|
|
1088
1093
|
sector_name = spec.upgrade_policy.conditions.sector
|
|
@@ -1297,10 +1302,8 @@ def remaining_soak_day_metric_values_for_cluster(
|
|
|
1297
1302
|
remaining_soakdays[idx] = UPGRADE_STARTED_METRIC_VALUE
|
|
1298
1303
|
if current_upgrade.next_run:
|
|
1299
1304
|
# if an upgrade runs for over 6 hours, we mark it as a long running upgrade
|
|
1300
|
-
next_run =
|
|
1301
|
-
|
|
1302
|
-
)
|
|
1303
|
-
now = datetime.utcnow()
|
|
1305
|
+
next_run = from_utc_iso_format(current_upgrade.next_run)
|
|
1306
|
+
now = utc_now()
|
|
1304
1307
|
hours_ago = (now - next_run).total_seconds() / 3600
|
|
1305
1308
|
if hours_ago >= 6:
|
|
1306
1309
|
remaining_soakdays[idx] = UPGRADE_LONG_RUNNING_METRIC_VALUE
|
|
@@ -20,6 +20,7 @@ from reconcile.gql_definitions.automated_actions.instance import (
|
|
|
20
20
|
AutomatedActionExternalResourceFlushElastiCacheV1,
|
|
21
21
|
AutomatedActionExternalResourceRdsRebootV1,
|
|
22
22
|
AutomatedActionExternalResourceRdsSnapshotV1,
|
|
23
|
+
AutomatedActionOpenshiftTriggerCronjobV1,
|
|
23
24
|
AutomatedActionOpenshiftWorkloadDeleteV1,
|
|
24
25
|
AutomatedActionOpenshiftWorkloadRestartArgumentV1,
|
|
25
26
|
AutomatedActionOpenshiftWorkloadRestartV1,
|
|
@@ -205,6 +206,17 @@ class AutomatedActionsConfigIntegration(
|
|
|
205
206
|
"account": f"^{rds_snapshot_er.provisioner.name}$",
|
|
206
207
|
"identifier": rds_snapshot_arg.identifier,
|
|
207
208
|
})
|
|
209
|
+
case AutomatedActionOpenshiftTriggerCronjobV1():
|
|
210
|
+
parameters.extend(
|
|
211
|
+
{
|
|
212
|
+
# all parameter values are regexes in the OPA policy
|
|
213
|
+
# therefore, cluster and namespace must be fixed to the current strings
|
|
214
|
+
"cluster": f"^{arg.namespace.cluster.name}$",
|
|
215
|
+
"namespace": f"^{arg.namespace.name}$",
|
|
216
|
+
"cronjob": arg.cronjob,
|
|
217
|
+
}
|
|
218
|
+
for arg in action.openshift_trigger_cronjob_arguments
|
|
219
|
+
)
|
|
208
220
|
case AutomatedActionOpenshiftWorkloadDeleteV1():
|
|
209
221
|
parameters.extend(
|
|
210
222
|
{
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
from collections.abc import Callable, Iterable
|
|
2
|
-
from datetime import UTC, datetime
|
|
3
2
|
from typing import Any
|
|
4
3
|
|
|
5
4
|
import jinja2
|
|
@@ -26,6 +25,7 @@ from reconcile.typed_queries.gitlab_instances import get_gitlab_instances
|
|
|
26
25
|
from reconcile.utils import gql, metrics
|
|
27
26
|
from reconcile.utils.aws_api_typed.api import AWSApi, AWSStaticCredentials
|
|
28
27
|
from reconcile.utils.aws_api_typed.iam import AWSAccessKey
|
|
28
|
+
from reconcile.utils.datetime_util import utc_now
|
|
29
29
|
from reconcile.utils.defer import defer
|
|
30
30
|
from reconcile.utils.disabled_integrations import integration_is_enabled
|
|
31
31
|
from reconcile.utils.runtime.integration import (
|
|
@@ -101,7 +101,7 @@ class AwsAccountMgmtIntegration(
|
|
|
101
101
|
"accountRequest": account_request.dict(by_alias=True),
|
|
102
102
|
"uid": uid,
|
|
103
103
|
"settings": settings,
|
|
104
|
-
"timestamp": int(
|
|
104
|
+
"timestamp": int(utc_now().timestamp()),
|
|
105
105
|
})
|
|
106
106
|
return tmpl
|
|
107
107
|
|
|
@@ -26,6 +26,7 @@ from reconcile.typed_queries.app_interface_vault_settings import (
|
|
|
26
26
|
)
|
|
27
27
|
from reconcile.utils import gql
|
|
28
28
|
from reconcile.utils.aws_api import AWSApi
|
|
29
|
+
from reconcile.utils.datetime_util import from_utc_iso_format, utc_now
|
|
29
30
|
from reconcile.utils.defer import defer
|
|
30
31
|
from reconcile.utils.parse_dhms_duration import dhms_to_seconds
|
|
31
32
|
from reconcile.utils.secret_reader import create_secret_reader
|
|
@@ -77,7 +78,7 @@ def get_aws_amis(
|
|
|
77
78
|
owner: str,
|
|
78
79
|
regex: str,
|
|
79
80
|
age_in_seconds: int,
|
|
80
|
-
|
|
81
|
+
now: datetime,
|
|
81
82
|
) -> list[AWSAmi]:
|
|
82
83
|
"""Get amis that match regex older than given age"""
|
|
83
84
|
|
|
@@ -89,10 +90,8 @@ def get_aws_amis(
|
|
|
89
90
|
if not re.search(pattern, image["Name"]):
|
|
90
91
|
continue
|
|
91
92
|
|
|
92
|
-
creation_date =
|
|
93
|
-
|
|
94
|
-
)
|
|
95
|
-
current_delta = utc_now - creation_date
|
|
93
|
+
creation_date = from_utc_iso_format(image["CreationDate"])
|
|
94
|
+
current_delta = now - creation_date
|
|
96
95
|
delete_delta = timedelta(seconds=age_in_seconds)
|
|
97
96
|
|
|
98
97
|
if current_delta < delete_delta:
|
|
@@ -135,7 +134,7 @@ def get_region(
|
|
|
135
134
|
|
|
136
135
|
@defer
|
|
137
136
|
def run(dry_run: bool, thread_pool_size: int, defer: Callable | None = None) -> None:
|
|
138
|
-
|
|
137
|
+
now = utc_now()
|
|
139
138
|
gqlapi = gql.get_api()
|
|
140
139
|
aws_accounts = aws_accounts_query(gqlapi.query).accounts
|
|
141
140
|
|
|
@@ -222,7 +221,7 @@ def run(dry_run: bool, thread_pool_size: int, defer: Callable | None = None) ->
|
|
|
222
221
|
owner=account.uid,
|
|
223
222
|
regex=cleanup_config.regex,
|
|
224
223
|
age_in_seconds=age_in_seconds,
|
|
225
|
-
|
|
224
|
+
now=now,
|
|
226
225
|
)
|
|
227
226
|
|
|
228
227
|
for ami in aws_amis:
|
reconcile/aws_ami_share.py
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import logging
|
|
2
|
+
import re
|
|
2
3
|
from collections.abc import (
|
|
3
|
-
Callable,
|
|
4
4
|
Iterable,
|
|
5
5
|
Mapping,
|
|
6
6
|
)
|
|
7
7
|
from typing import Any
|
|
8
8
|
|
|
9
9
|
from reconcile import queries
|
|
10
|
+
from reconcile.typed_queries.aws_account_tags import get_aws_account_tags
|
|
11
|
+
from reconcile.typed_queries.external_resources import get_settings
|
|
10
12
|
from reconcile.utils.aws_api import AWSApi
|
|
11
|
-
from reconcile.utils.defer import defer
|
|
12
13
|
|
|
13
14
|
QONTRACT_INTEGRATION = "aws-ami-share"
|
|
14
|
-
|
|
15
|
+
|
|
16
|
+
MANAGED_TAG = {"managed_by_integration": QONTRACT_INTEGRATION}
|
|
15
17
|
|
|
16
18
|
|
|
17
19
|
def filter_accounts(accounts: Iterable[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
@@ -37,65 +39,70 @@ def get_region(
|
|
|
37
39
|
return region
|
|
38
40
|
|
|
39
41
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
def share_ami(
|
|
43
|
+
dry_run: bool,
|
|
44
|
+
src_account: Mapping[str, Any],
|
|
45
|
+
share: Mapping[str, Any],
|
|
46
|
+
default_tags: dict[str, str],
|
|
47
|
+
aws_api: AWSApi,
|
|
48
|
+
) -> None:
|
|
49
|
+
dst_account = share["account"]
|
|
50
|
+
regex = re.compile(share["regex"])
|
|
51
|
+
region = get_region(share, src_account, dst_account)
|
|
52
|
+
src_amis = aws_api.get_amis_details(src_account, src_account, regex, region)
|
|
53
|
+
dst_amis = aws_api.get_amis_details(dst_account, src_account, regex, region)
|
|
54
|
+
|
|
55
|
+
for ami_id, src_ami_tags in src_amis.items():
|
|
56
|
+
dst_ami_tags = dst_amis.get(ami_id)
|
|
57
|
+
if dst_ami_tags is None:
|
|
58
|
+
logging.info([
|
|
59
|
+
"share_ami",
|
|
60
|
+
src_account["name"],
|
|
61
|
+
dst_account["name"],
|
|
62
|
+
ami_id,
|
|
63
|
+
])
|
|
64
|
+
if not dry_run:
|
|
65
|
+
aws_api.share_ami(src_account, dst_account["uid"], ami_id, region)
|
|
66
|
+
dst_account_tags = default_tags | get_aws_account_tags(
|
|
67
|
+
dst_account.get("organization", None)
|
|
68
|
+
)
|
|
69
|
+
desired_tags = src_ami_tags | dst_account_tags | MANAGED_TAG
|
|
70
|
+
current_tags = dst_ami_tags or {}
|
|
71
|
+
|
|
72
|
+
if desired_tags != current_tags:
|
|
73
|
+
logging.info([
|
|
74
|
+
"tag_shared_ami",
|
|
75
|
+
dst_account["name"],
|
|
76
|
+
ami_id,
|
|
77
|
+
desired_tags,
|
|
78
|
+
])
|
|
79
|
+
if not dry_run:
|
|
80
|
+
aws_api.create_tags(dst_account, ami_id, desired_tags)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def run(dry_run: bool) -> None:
|
|
42
84
|
accounts = queries.get_aws_accounts(sharing=True)
|
|
43
85
|
sharing_accounts = filter_accounts(accounts)
|
|
44
86
|
settings = queries.get_app_interface_settings()
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
"share_ami",
|
|
68
|
-
src_account["name"],
|
|
69
|
-
dst_account["name"],
|
|
70
|
-
src_ami_id,
|
|
71
|
-
])
|
|
72
|
-
if not dry_run:
|
|
73
|
-
aws_api.share_ami(
|
|
74
|
-
src_account, dst_account["uid"], src_ami_id, region
|
|
75
|
-
)
|
|
76
|
-
# we assume an unshared ami does not have tags
|
|
77
|
-
found_dst_amis = [{"image_id": src_ami_id, "tags": []}]
|
|
78
|
-
|
|
79
|
-
dst_ami = found_dst_amis[0]
|
|
80
|
-
dst_ami_id = dst_ami["image_id"]
|
|
81
|
-
dst_ami_tags = dst_ami["tags"]
|
|
82
|
-
if MANAGED_TAG not in dst_ami_tags:
|
|
83
|
-
logging.info([
|
|
84
|
-
"tag_shared_ami",
|
|
85
|
-
dst_account["name"],
|
|
86
|
-
dst_ami_id,
|
|
87
|
-
MANAGED_TAG,
|
|
88
|
-
])
|
|
89
|
-
if not dry_run:
|
|
90
|
-
aws_api.create_tag(dst_account, dst_ami_id, MANAGED_TAG)
|
|
91
|
-
src_ami_tags = src_ami["tags"]
|
|
92
|
-
for src_tag in src_ami_tags:
|
|
93
|
-
if src_tag not in dst_ami_tags:
|
|
94
|
-
logging.info([
|
|
95
|
-
"tag_shared_ami",
|
|
96
|
-
dst_account["name"],
|
|
97
|
-
dst_ami_id,
|
|
98
|
-
src_tag,
|
|
99
|
-
])
|
|
100
|
-
if not dry_run:
|
|
101
|
-
aws_api.create_tag(dst_account, dst_ami_id, src_tag)
|
|
87
|
+
try:
|
|
88
|
+
default_tags = get_settings().default_tags
|
|
89
|
+
except ValueError:
|
|
90
|
+
# no external resources settings found
|
|
91
|
+
default_tags = {}
|
|
92
|
+
|
|
93
|
+
with AWSApi(
|
|
94
|
+
1,
|
|
95
|
+
sharing_accounts,
|
|
96
|
+
settings=settings,
|
|
97
|
+
init_users=False,
|
|
98
|
+
) as aws_api:
|
|
99
|
+
for src_account in sharing_accounts:
|
|
100
|
+
for share in src_account.get("sharing") or []:
|
|
101
|
+
if share["provider"] == "ami":
|
|
102
|
+
share_ami(
|
|
103
|
+
dry_run=dry_run,
|
|
104
|
+
src_account=src_account,
|
|
105
|
+
share=share,
|
|
106
|
+
default_tags=default_tags,
|
|
107
|
+
aws_api=aws_api,
|
|
108
|
+
)
|