newrelic-lambda-cli 0.9.11__tar.gz → 0.9.12__tar.gz
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.
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/PKG-INFO +1 -1
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/api.py +0 -2
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cli/layers.py +0 -6
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/layers.py +14 -12
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli.egg-info/PKG-INFO +1 -1
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/setup.py +1 -1
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/tests/test_layers.py +251 -173
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/CODE_OF_CONDUCT.md +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/CONTRIBUTING.md +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/LICENSE +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/MANIFEST.in +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/README.md +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/THIRD_PARTY_NOTICES.md +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/__init__.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cli/__init__.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cli/decorators.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cli/functions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cli/integrations.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cli/otel_ingestions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cli/subscriptions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cliutils.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/functions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/integrations.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/otel_ingestions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/permissions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/subscriptions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/templates/import-template.yaml +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/templates/license-key-secret.yaml +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/templates/nr-lambda-integration-role.yaml +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/types.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/utils.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli.egg-info/SOURCES.txt +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli.egg-info/dependency_links.txt +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli.egg-info/entry_points.txt +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli.egg-info/not-zip-safe +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli.egg-info/requires.txt +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli.egg-info/top_level.txt +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/pyproject.toml +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/setup.cfg +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/tests/test_api.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/tests/test_functions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/tests/test_integrations.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/tests/test_new_relic_gql.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/tests/test_permissions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/tests/test_subscriptions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/tests/test_utils.py +0 -0
|
@@ -362,8 +362,6 @@ def validate_gql_credentials(input):
|
|
|
362
362
|
|
|
363
363
|
def retrieve_license_key(gql):
|
|
364
364
|
global __cached_license_key
|
|
365
|
-
if gql is None and input and getattr(input, "nr_ingest_key", None):
|
|
366
|
-
return input.nr_ingest_key
|
|
367
365
|
|
|
368
366
|
if __cached_license_key:
|
|
369
367
|
return __cached_license_key
|
|
@@ -155,12 +155,6 @@ def register(group):
|
|
|
155
155
|
@click.pass_context
|
|
156
156
|
def install(ctx, **kwargs):
|
|
157
157
|
"""Install New Relic AWS Lambda Layers"""
|
|
158
|
-
|
|
159
|
-
if "nr_ingest_key" not in kwargs:
|
|
160
|
-
kwargs["nr_ingest_key"] = None
|
|
161
|
-
if "nr_api_key" not in kwargs:
|
|
162
|
-
kwargs["nr_api_key"] = None
|
|
163
|
-
|
|
164
158
|
input = LayerInstall(session=None, verbose=ctx.obj["VERBOSE"], **kwargs)
|
|
165
159
|
input = input._replace(
|
|
166
160
|
session=boto3.Session(
|
|
@@ -267,10 +267,10 @@ def _add_new_relic(input, config, nr_license_key):
|
|
|
267
267
|
update_kwargs["Environment"]["Variables"][
|
|
268
268
|
"NEW_RELIC_LICENSE_KEY"
|
|
269
269
|
] = nr_license_key
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
270
|
+
else:
|
|
271
|
+
update_kwargs["Environment"]["Variables"][
|
|
272
|
+
"NEW_RELIC_LAMBDA_EXTENSION_ENABLED"
|
|
273
|
+
] = "false"
|
|
274
274
|
|
|
275
275
|
if "dotnet" in runtime:
|
|
276
276
|
update_kwargs["Environment"]["Variables"]["CORECLR_ENABLE_PROFILING"] = "1"
|
|
@@ -300,10 +300,6 @@ def install(input, function_arn):
|
|
|
300
300
|
raise click.UsageError(
|
|
301
301
|
"Please provide either the --nr-api-key or the --nr-ingest-key flag, but not both."
|
|
302
302
|
)
|
|
303
|
-
if not input.nr_api_key and not input.nr_ingest_key:
|
|
304
|
-
raise click.UsageError(
|
|
305
|
-
"Please provide either the --nr-api-key or the --nr-ingest-key flag."
|
|
306
|
-
)
|
|
307
303
|
assert isinstance(input, LayerInstall)
|
|
308
304
|
|
|
309
305
|
client = input.session.client("lambda")
|
|
@@ -323,6 +319,7 @@ def install(input, function_arn):
|
|
|
323
319
|
and nr_account_id
|
|
324
320
|
and nr_account_id != str(input.nr_account_id)
|
|
325
321
|
and not input.nr_api_key
|
|
322
|
+
and not input.nr_ingest_key
|
|
326
323
|
):
|
|
327
324
|
raise click.UsageError(
|
|
328
325
|
"A managed secret already exists in this region for New Relic account {0}. "
|
|
@@ -335,7 +332,12 @@ def install(input, function_arn):
|
|
|
335
332
|
nr_account_id, input.nr_account_id, utils.NR_DOCS_ACT_LINKING_URL
|
|
336
333
|
)
|
|
337
334
|
)
|
|
338
|
-
if
|
|
335
|
+
if (
|
|
336
|
+
input.enable_extension
|
|
337
|
+
and not policy_arn
|
|
338
|
+
and not input.nr_api_key
|
|
339
|
+
and not input.nr_ingest_key
|
|
340
|
+
):
|
|
339
341
|
raise click.UsageError(
|
|
340
342
|
"In order to use `--enable-extension`, you must first run "
|
|
341
343
|
"`newrelic-lambda integrations install` with the "
|
|
@@ -347,7 +349,9 @@ def install(input, function_arn):
|
|
|
347
349
|
)
|
|
348
350
|
|
|
349
351
|
nr_license_key = None
|
|
350
|
-
if
|
|
352
|
+
if input.nr_ingest_key:
|
|
353
|
+
nr_license_key = input.nr_ingest_key
|
|
354
|
+
elif (
|
|
351
355
|
not policy_arn
|
|
352
356
|
or nr_account_id != str(input.nr_account_id)
|
|
353
357
|
and input.nr_api_key
|
|
@@ -355,8 +359,6 @@ def install(input, function_arn):
|
|
|
355
359
|
):
|
|
356
360
|
gql = api.validate_gql_credentials(input)
|
|
357
361
|
nr_license_key = api.retrieve_license_key(gql)
|
|
358
|
-
elif input.nr_ingest_key:
|
|
359
|
-
nr_license_key = input.nr_ingest_key
|
|
360
362
|
|
|
361
363
|
update_kwargs = _add_new_relic(input, config, nr_license_key)
|
|
362
364
|
if isinstance(update_kwargs, bool):
|
|
@@ -6,7 +6,7 @@ README = open(os.path.join(os.path.dirname(__file__), "README.md"), "r").read()
|
|
|
6
6
|
|
|
7
7
|
setup(
|
|
8
8
|
name="newrelic-lambda-cli",
|
|
9
|
-
version="0.9.
|
|
9
|
+
version="0.9.12",
|
|
10
10
|
python_requires=">=3.3",
|
|
11
11
|
description="A CLI to install the New Relic AWS Lambda integration and layers.",
|
|
12
12
|
long_description=README,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import boto3
|
|
2
|
-
import click
|
|
3
2
|
from click import UsageError
|
|
4
3
|
from moto import mock_aws
|
|
5
4
|
import pytest
|
|
@@ -50,7 +49,7 @@ def test_add_new_relic(aws_credentials, mock_function_config):
|
|
|
50
49
|
)
|
|
51
50
|
assert (
|
|
52
51
|
update_kwargs["Environment"]["Variables"]["NEW_RELIC_LAMBDA_EXTENSION_ENABLED"]
|
|
53
|
-
== "
|
|
52
|
+
== "true"
|
|
54
53
|
)
|
|
55
54
|
assert (
|
|
56
55
|
update_kwargs["Environment"]["Variables"][
|
|
@@ -317,6 +316,7 @@ def test_install_apm(aws_credentials, mock_function_config):
|
|
|
317
316
|
"EXISTING_ENV_VAR": "Hello World",
|
|
318
317
|
"NEW_RELIC_ACCOUNT_ID": "12345",
|
|
319
318
|
"NEW_RELIC_LAMBDA_HANDLER": "original_handler",
|
|
319
|
+
"NEW_RELIC_LAMBDA_EXTENSION_ENABLED": "false",
|
|
320
320
|
"NEW_RELIC_APM_LAMBDA_MODE": "True",
|
|
321
321
|
}
|
|
322
322
|
},
|
|
@@ -378,7 +378,7 @@ def test_add_new_relic_dotnet(aws_credentials, mock_function_config):
|
|
|
378
378
|
update_kwargs["Environment"]["Variables"][
|
|
379
379
|
"NEW_RELIC_LAMBDA_EXTENSION_ENABLED"
|
|
380
380
|
]
|
|
381
|
-
== "
|
|
381
|
+
== "true"
|
|
382
382
|
)
|
|
383
383
|
assert (
|
|
384
384
|
update_kwargs["Environment"]["Variables"][
|
|
@@ -623,9 +623,9 @@ def test_install_failure(aws_credentials, mock_function_config):
|
|
|
623
623
|
install(
|
|
624
624
|
layer_install(
|
|
625
625
|
nr_account_id=9876543,
|
|
626
|
-
session=mock_session,
|
|
627
626
|
nr_api_key=None,
|
|
628
627
|
nr_ingest_key=None,
|
|
628
|
+
session=mock_session,
|
|
629
629
|
),
|
|
630
630
|
"foobarbaz",
|
|
631
631
|
)
|
|
@@ -643,13 +643,17 @@ def test_install(aws_credentials, mock_function_config):
|
|
|
643
643
|
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
644
644
|
config = mock_function_config("python3.12")
|
|
645
645
|
mock_client.get_function.return_value = config
|
|
646
|
+
# with pytest.raises(UsageError):
|
|
647
|
+
# install(
|
|
648
|
+
# layer_install(nr_account_id=9876543, session=mock_session), "foobarbaz"
|
|
649
|
+
# )
|
|
646
650
|
with pytest.raises(UsageError):
|
|
647
651
|
install(
|
|
648
652
|
layer_install(
|
|
649
653
|
nr_account_id=9876543,
|
|
650
|
-
session=mock_session,
|
|
651
654
|
nr_api_key=None,
|
|
652
655
|
nr_ingest_key=None,
|
|
656
|
+
session=mock_session,
|
|
653
657
|
),
|
|
654
658
|
"foobarbaz",
|
|
655
659
|
)
|
|
@@ -693,6 +697,7 @@ def test_install(aws_credentials, mock_function_config):
|
|
|
693
697
|
"EXISTING_ENV_VAR": "Hello World",
|
|
694
698
|
"NEW_RELIC_ACCOUNT_ID": "12345",
|
|
695
699
|
"NEW_RELIC_LAMBDA_HANDLER": "original_handler",
|
|
700
|
+
"NEW_RELIC_LAMBDA_EXTENSION_ENABLED": "false",
|
|
696
701
|
}
|
|
697
702
|
},
|
|
698
703
|
Layers=ANY,
|
|
@@ -1163,272 +1168,345 @@ def test_add_new_relic_sets_both_nr_tags_and_env_delimiter(
|
|
|
1163
1168
|
)
|
|
1164
1169
|
|
|
1165
1170
|
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
config = mock_function_config("python3.12")
|
|
1172
|
-
|
|
1173
|
-
update_kwargs = _add_new_relic(
|
|
1174
|
-
layer_install(
|
|
1175
|
-
session=session,
|
|
1176
|
-
aws_region="us-east-1",
|
|
1177
|
-
nr_account_id=12345,
|
|
1178
|
-
enable_extension=True,
|
|
1179
|
-
nr_ingest_key="test-ingest-key-12345",
|
|
1180
|
-
),
|
|
1181
|
-
config,
|
|
1182
|
-
nr_license_key=None,
|
|
1183
|
-
)
|
|
1171
|
+
def test_install_account_id_mismatch_requires_key(
|
|
1172
|
+
aws_credentials, mock_function_config
|
|
1173
|
+
):
|
|
1174
|
+
"""Test that account ID mismatch raises UsageError when neither API key nor ingest key is provided"""
|
|
1184
1175
|
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
update_kwargs["Environment"]["Variables"]["NEW_RELIC_LICENSE_KEY"]
|
|
1188
|
-
== "test-ingest-key-12345"
|
|
1189
|
-
)
|
|
1190
|
-
assert (
|
|
1191
|
-
update_kwargs["Environment"]["Variables"]["NEW_RELIC_LAMBDA_EXTENSION_ENABLED"]
|
|
1192
|
-
== "true"
|
|
1193
|
-
)
|
|
1176
|
+
mock_session = MagicMock()
|
|
1177
|
+
mock_session.region_name = "us-east-1"
|
|
1194
1178
|
|
|
1179
|
+
with patch(
|
|
1180
|
+
"newrelic_lambda_cli.layers._get_license_key_outputs"
|
|
1181
|
+
) as mock_get_license_key_outputs:
|
|
1195
1182
|
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
aws_credentials, mock_function_config
|
|
1199
|
-
):
|
|
1200
|
-
"""Test _add_new_relic function when neither license key nor ingest key is provided"""
|
|
1201
|
-
session = boto3.Session(region_name="us-east-1")
|
|
1183
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1184
|
+
mock_client = mock_session.client.return_value
|
|
1202
1185
|
|
|
1203
|
-
|
|
1186
|
+
config = mock_function_config("python3.12")
|
|
1187
|
+
mock_client.get_function.return_value = config
|
|
1204
1188
|
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
nr_license_key=None,
|
|
1214
|
-
)
|
|
1189
|
+
# Create a LayerInstall instance with explicitly None keys
|
|
1190
|
+
# Don't mock LayerInstall itself - just create an instance with the properties we need
|
|
1191
|
+
install_params = layer_install(
|
|
1192
|
+
nr_account_id=9876543, # Different from "12345" in mock
|
|
1193
|
+
nr_api_key=None, # Explicitly None
|
|
1194
|
+
nr_ingest_key=None, # Explicitly None
|
|
1195
|
+
session=mock_session,
|
|
1196
|
+
)
|
|
1215
1197
|
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
== "false"
|
|
1220
|
-
)
|
|
1221
|
-
assert "NEW_RELIC_LICENSE_KEY" not in update_kwargs["Environment"]["Variables"]
|
|
1198
|
+
# This should now raise the UsageError
|
|
1199
|
+
with pytest.raises(UsageError):
|
|
1200
|
+
install(install_params, "foobarbaz")
|
|
1222
1201
|
|
|
1223
1202
|
|
|
1224
1203
|
@mock_aws
|
|
1225
|
-
def
|
|
1226
|
-
"""Test
|
|
1227
|
-
session = boto3.Session(region_name="us-east-1")
|
|
1204
|
+
def test_add_new_relic_with_ingest_key(aws_credentials, mock_function_config):
|
|
1205
|
+
"""Test that ingest key is properly set as the license key in _add_new_relic"""
|
|
1228
1206
|
|
|
1207
|
+
session = boto3.Session(region_name="us-east-1")
|
|
1229
1208
|
config = mock_function_config("python3.12")
|
|
1209
|
+
test_ingest_key = "test-ingest-key-direct"
|
|
1230
1210
|
|
|
1231
1211
|
update_kwargs = _add_new_relic(
|
|
1232
1212
|
layer_install(
|
|
1233
1213
|
session=session,
|
|
1234
1214
|
aws_region="us-east-1",
|
|
1235
1215
|
nr_account_id=12345,
|
|
1216
|
+
nr_ingest_key=test_ingest_key,
|
|
1236
1217
|
enable_extension=True,
|
|
1237
|
-
nr_region="staging",
|
|
1238
|
-
nr_ingest_key="test-ingest-key",
|
|
1239
1218
|
),
|
|
1240
1219
|
config,
|
|
1241
|
-
nr_license_key=None,
|
|
1220
|
+
nr_license_key=None, # This should be ignored because ingest key is provided
|
|
1242
1221
|
)
|
|
1243
1222
|
|
|
1244
|
-
# Verify
|
|
1223
|
+
# Verify the ingest key was set as license key
|
|
1224
|
+
assert "NEW_RELIC_LICENSE_KEY" in update_kwargs["Environment"]["Variables"]
|
|
1245
1225
|
assert (
|
|
1246
|
-
update_kwargs["Environment"]["Variables"]["
|
|
1247
|
-
==
|
|
1226
|
+
update_kwargs["Environment"]["Variables"]["NEW_RELIC_LICENSE_KEY"]
|
|
1227
|
+
== test_ingest_key
|
|
1248
1228
|
)
|
|
1229
|
+
|
|
1230
|
+
# Verify extension is enabled (since we have a license key)
|
|
1249
1231
|
assert (
|
|
1250
|
-
update_kwargs["Environment"]["Variables"]["
|
|
1251
|
-
== "
|
|
1232
|
+
update_kwargs["Environment"]["Variables"]["NEW_RELIC_LAMBDA_EXTENSION_ENABLED"]
|
|
1233
|
+
== "true"
|
|
1252
1234
|
)
|
|
1253
1235
|
|
|
1254
1236
|
|
|
1255
|
-
|
|
1237
|
+
@mock_aws
|
|
1238
|
+
def test_install_with_ingest_key_bypass_account_validation(
|
|
1256
1239
|
aws_credentials, mock_function_config
|
|
1257
1240
|
):
|
|
1258
|
-
"""Test
|
|
1241
|
+
"""Test that using ingest key bypasses account ID validation and works correctly"""
|
|
1242
|
+
|
|
1259
1243
|
mock_session = MagicMock()
|
|
1260
1244
|
mock_session.region_name = "us-east-1"
|
|
1245
|
+
test_ingest_key = "test-ingest-key-value"
|
|
1261
1246
|
|
|
1262
|
-
with
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
):
|
|
1266
|
-
|
|
1247
|
+
# Part 1: Test with the real implementation, verifying _add_new_relic works properly
|
|
1248
|
+
with patch(
|
|
1249
|
+
"newrelic_lambda_cli.layers._get_license_key_outputs"
|
|
1250
|
+
) as mock_get_license_key_outputs:
|
|
1251
|
+
|
|
1252
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1253
|
+
|
|
1254
|
+
# Test the _add_new_relic function directly first
|
|
1255
|
+
session = boto3.Session(region_name="us-east-1")
|
|
1256
|
+
config = mock_function_config("python3.12")
|
|
1257
|
+
|
|
1258
|
+
# Test that _add_new_relic correctly handles ingest key
|
|
1259
|
+
update_kwargs = _add_new_relic(
|
|
1267
1260
|
layer_install(
|
|
1268
|
-
session=
|
|
1261
|
+
session=session,
|
|
1262
|
+
aws_region="us-east-1",
|
|
1269
1263
|
nr_account_id=12345,
|
|
1270
|
-
|
|
1271
|
-
|
|
1264
|
+
nr_ingest_key=test_ingest_key,
|
|
1265
|
+
enable_extension=True,
|
|
1272
1266
|
),
|
|
1273
|
-
|
|
1267
|
+
config,
|
|
1268
|
+
nr_license_key=None, # Should be ignored because ingest key is provided
|
|
1274
1269
|
)
|
|
1275
1270
|
|
|
1271
|
+
# Verify ingest key is properly set in environment
|
|
1272
|
+
assert "NEW_RELIC_LICENSE_KEY" in update_kwargs["Environment"]["Variables"]
|
|
1273
|
+
assert (
|
|
1274
|
+
update_kwargs["Environment"]["Variables"]["NEW_RELIC_LICENSE_KEY"]
|
|
1275
|
+
== test_ingest_key
|
|
1276
|
+
)
|
|
1277
|
+
assert (
|
|
1278
|
+
update_kwargs["Environment"]["Variables"][
|
|
1279
|
+
"NEW_RELIC_LAMBDA_EXTENSION_ENABLED"
|
|
1280
|
+
]
|
|
1281
|
+
== "true"
|
|
1282
|
+
)
|
|
1276
1283
|
|
|
1277
|
-
|
|
1278
|
-
"""Test successful install with ingest key"""
|
|
1279
|
-
mock_session = MagicMock()
|
|
1280
|
-
mock_session.region_name = "us-east-1"
|
|
1281
|
-
mock_client = mock_session.client.return_value
|
|
1282
|
-
|
|
1284
|
+
# Part 2: Test that install() passes the ingest key properly to _add_new_relic
|
|
1283
1285
|
with patch(
|
|
1284
1286
|
"newrelic_lambda_cli.layers._get_license_key_outputs"
|
|
1285
1287
|
) as mock_get_license_key_outputs, patch(
|
|
1286
|
-
"newrelic_lambda_cli.
|
|
1287
|
-
) as
|
|
1288
|
+
"newrelic_lambda_cli.api.validate_gql_credentials"
|
|
1289
|
+
) as mock_validate_gql, patch(
|
|
1288
1290
|
"newrelic_lambda_cli.layers._add_new_relic"
|
|
1289
1291
|
) as mock_add_new_relic:
|
|
1290
1292
|
|
|
1291
|
-
#
|
|
1292
|
-
mock_get_license_key_outputs.return_value = (
|
|
1293
|
-
|
|
1293
|
+
# Setup mocks
|
|
1294
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1295
|
+
mock_client = mock_session.client.return_value
|
|
1296
|
+
config = mock_function_config("python3.12")
|
|
1297
|
+
mock_client.get_function.return_value = config
|
|
1298
|
+
|
|
1299
|
+
# Make _add_new_relic return a successful result
|
|
1294
1300
|
mock_add_new_relic.return_value = {
|
|
1295
|
-
"FunctionName": "test-function",
|
|
1296
|
-
"
|
|
1297
|
-
"
|
|
1298
|
-
}
|
|
1299
|
-
mock_client.update_function_configuration.return_value = {
|
|
1300
|
-
"Configuration": {
|
|
1301
|
-
"Layers": [{"Arn": "existing-layer"}],
|
|
1302
|
-
"FunctionArn": "test-function",
|
|
1303
|
-
}
|
|
1301
|
+
"FunctionName": "test-function-name",
|
|
1302
|
+
"Layers": ["test-layer-arn"],
|
|
1303
|
+
"Environment": {"Variables": {"NEW_RELIC_LICENSE_KEY": test_ingest_key}},
|
|
1304
1304
|
}
|
|
1305
1305
|
|
|
1306
|
+
# Call install with ingest key and mismatched account ID
|
|
1306
1307
|
result = install(
|
|
1307
1308
|
layer_install(
|
|
1309
|
+
nr_account_id=9876543, # Different from "12345" in the mock
|
|
1310
|
+
nr_ingest_key=test_ingest_key,
|
|
1308
1311
|
session=mock_session,
|
|
1309
|
-
nr_account_id=12345,
|
|
1310
|
-
nr_ingest_key="test-ingest-key",
|
|
1311
|
-
enable_extension=False,
|
|
1312
1312
|
),
|
|
1313
|
-
"
|
|
1313
|
+
"foobarbaz",
|
|
1314
1314
|
)
|
|
1315
1315
|
|
|
1316
|
+
# Installation should succeed despite account ID mismatch
|
|
1316
1317
|
assert result is True
|
|
1317
|
-
|
|
1318
|
+
|
|
1319
|
+
# GraphQL validation should not be called
|
|
1320
|
+
mock_validate_gql.assert_not_called()
|
|
1321
|
+
|
|
1322
|
+
# Verify _add_new_relic was called with correct parameters
|
|
1323
|
+
mock_add_new_relic.assert_called_once()
|
|
1324
|
+
|
|
1325
|
+
# Verify the ingest key was passed correctly
|
|
1326
|
+
args = mock_add_new_relic.call_args[0]
|
|
1327
|
+
assert hasattr(args[0], "nr_ingest_key")
|
|
1328
|
+
assert args[0].nr_ingest_key == test_ingest_key
|
|
1329
|
+
assert args[2] == test_ingest_key # Third argument is the license key
|
|
1318
1330
|
|
|
1319
1331
|
|
|
1320
1332
|
@mock_aws
|
|
1321
|
-
def
|
|
1322
|
-
|
|
1333
|
+
def test_install_sets_license_key_from_ingest_key(
|
|
1334
|
+
aws_credentials, mock_function_config
|
|
1335
|
+
):
|
|
1336
|
+
"""Test that the install function properly passes the ingest key to _add_new_relic"""
|
|
1337
|
+
|
|
1323
1338
|
mock_session = MagicMock()
|
|
1324
1339
|
mock_session.region_name = "us-east-1"
|
|
1325
|
-
mock_client = mock_session.client.return_value
|
|
1326
1340
|
|
|
1327
1341
|
with patch(
|
|
1342
|
+
"newrelic_lambda_cli.layers._add_new_relic",
|
|
1343
|
+
side_effect=lambda input_obj, config, nr_license_key: {
|
|
1344
|
+
"FunctionName": "test-function-name",
|
|
1345
|
+
"Layers": ["test-layer-arn"],
|
|
1346
|
+
"Environment": {
|
|
1347
|
+
"Variables": {
|
|
1348
|
+
# Create a dictionary with the passed license key
|
|
1349
|
+
"NEW_RELIC_LICENSE_KEY": nr_license_key,
|
|
1350
|
+
"NEW_RELIC_ACCOUNT_ID": str(input_obj.nr_account_id),
|
|
1351
|
+
"NEW_RELIC_LAMBDA_HANDLER": "original_handler",
|
|
1352
|
+
}
|
|
1353
|
+
},
|
|
1354
|
+
},
|
|
1355
|
+
) as mock_add_new_relic, patch(
|
|
1328
1356
|
"newrelic_lambda_cli.layers._get_license_key_outputs"
|
|
1329
|
-
) as mock_get_license_key_outputs
|
|
1330
|
-
"newrelic_lambda_cli.layers.get_function"
|
|
1331
|
-
) as mock_get_function, patch(
|
|
1332
|
-
"newrelic_lambda_cli.layers._add_new_relic"
|
|
1333
|
-
) as mock_add_new_relic:
|
|
1357
|
+
) as mock_get_license_key_outputs:
|
|
1334
1358
|
|
|
1335
|
-
mock_get_license_key_outputs.return_value = (
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
"Configuration": {"Layers": [], "FunctionArn": "test-function"}
|
|
1344
|
-
}
|
|
1345
|
-
mock_client.tag_resource.return_value = {}
|
|
1359
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1360
|
+
mock_client = mock_session.client.return_value
|
|
1361
|
+
|
|
1362
|
+
config = mock_function_config("python3.12")
|
|
1363
|
+
mock_client.get_function.return_value = config
|
|
1364
|
+
|
|
1365
|
+
# The specific ingest key value we want to test
|
|
1366
|
+
test_ingest_key = "test-ingest-key-direct-pass"
|
|
1346
1367
|
|
|
1368
|
+
# Call install with the ingest key
|
|
1347
1369
|
result = install(
|
|
1348
1370
|
layer_install(
|
|
1371
|
+
nr_account_id=9876543,
|
|
1372
|
+
nr_ingest_key=test_ingest_key,
|
|
1349
1373
|
session=mock_session,
|
|
1350
|
-
nr_account_id=12345,
|
|
1351
|
-
nr_api_key="test-api-key",
|
|
1352
|
-
nr_region="us",
|
|
1353
|
-
apm=True,
|
|
1354
|
-
verbose=True,
|
|
1355
|
-
enable_extension=False,
|
|
1356
1374
|
),
|
|
1357
|
-
"
|
|
1375
|
+
"foobarbaz",
|
|
1358
1376
|
)
|
|
1359
1377
|
|
|
1378
|
+
# Verify installation succeeded
|
|
1360
1379
|
assert result is True
|
|
1361
|
-
|
|
1380
|
+
|
|
1381
|
+
# Get the arguments that were passed to _add_new_relic
|
|
1382
|
+
args, kwargs = mock_add_new_relic.call_args
|
|
1383
|
+
|
|
1384
|
+
# The third argument should be the license key, which should be our ingest key
|
|
1385
|
+
assert (
|
|
1386
|
+
args[2] == test_ingest_key
|
|
1387
|
+
), f"Expected _add_new_relic to be called with ingest key '{test_ingest_key}' as license key, but got '{args[2]}'"
|
|
1362
1388
|
|
|
1363
1389
|
|
|
1364
1390
|
@mock_aws
|
|
1365
|
-
def
|
|
1366
|
-
"""Test
|
|
1391
|
+
def test_install_failure_explicit(aws_credentials, mock_function_config):
|
|
1392
|
+
"""Test that account ID mismatch raises UsageError when both keys are explicitly None"""
|
|
1393
|
+
|
|
1367
1394
|
mock_session = MagicMock()
|
|
1368
1395
|
mock_session.region_name = "us-east-1"
|
|
1396
|
+
mock_client = mock_session.client.return_value
|
|
1369
1397
|
|
|
1370
|
-
with patch(
|
|
1371
|
-
|
|
1398
|
+
with patch(
|
|
1399
|
+
"newrelic_lambda_cli.layers._get_license_key_outputs"
|
|
1400
|
+
) as mock_get_license_key_outputs:
|
|
1372
1401
|
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1402
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1403
|
+
config = mock_function_config("python3.12")
|
|
1404
|
+
mock_client.get_function.return_value = config
|
|
1405
|
+
|
|
1406
|
+
# Create a layer install with EXPLICITLY None values for both keys
|
|
1407
|
+
# This should guarantee the UsageError is raised for account mismatch
|
|
1408
|
+
install_params = layer_install(
|
|
1409
|
+
nr_account_id=9876543, # Different from "12345" in mock
|
|
1410
|
+
session=mock_session,
|
|
1411
|
+
)
|
|
1412
|
+
|
|
1413
|
+
# Use _replace to explicitly set both keys to None
|
|
1414
|
+
# This ensures we're testing the exact scenario that should raise an error
|
|
1415
|
+
explicit_none_params = install_params._replace(
|
|
1416
|
+
nr_api_key=None, nr_ingest_key=None
|
|
1380
1417
|
)
|
|
1381
1418
|
|
|
1382
|
-
|
|
1419
|
+
with pytest.raises(UsageError):
|
|
1420
|
+
install(explicit_none_params, "foobarbaz")
|
|
1421
|
+
|
|
1383
1422
|
|
|
1423
|
+
@mock_aws
|
|
1424
|
+
def test_install_account_id_mismatch_with_neither_key_type(
|
|
1425
|
+
aws_credentials, mock_function_config
|
|
1426
|
+
):
|
|
1427
|
+
"""
|
|
1428
|
+
Test that specifically reproduces conditions for original test_install_failure
|
|
1429
|
+
and test_install to ensure UsageError is still raised when:
|
|
1430
|
+
- Account IDs don't match
|
|
1431
|
+
- No keys are provided at all (neither API key nor ingest key)
|
|
1432
|
+
"""
|
|
1384
1433
|
|
|
1385
|
-
def test_install_secret_account_mismatch(aws_credentials):
|
|
1386
|
-
"""Test install with managed secret account ID mismatch"""
|
|
1387
1434
|
mock_session = MagicMock()
|
|
1388
1435
|
mock_session.region_name = "us-east-1"
|
|
1389
1436
|
|
|
1390
1437
|
with patch(
|
|
1391
1438
|
"newrelic_lambda_cli.layers._get_license_key_outputs"
|
|
1392
1439
|
) as mock_get_license_key_outputs, patch(
|
|
1393
|
-
"newrelic_lambda_cli.layers.
|
|
1394
|
-
) as
|
|
1440
|
+
"newrelic_lambda_cli.layers.install"
|
|
1441
|
+
) as mock_install, patch(
|
|
1442
|
+
"newrelic_lambda_cli.layers.hasattr", return_value=False
|
|
1443
|
+
):
|
|
1444
|
+
# Mock hasattr to always return False so the code thinks attributes don't exist
|
|
1395
1445
|
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
mock_get_function.return_value = {"Configuration": {"FunctionArn": "test"}}
|
|
1446
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1447
|
+
mock_client = mock_session.client.return_value
|
|
1399
1448
|
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1449
|
+
config = mock_function_config("python3.12")
|
|
1450
|
+
mock_client.get_function.return_value = config
|
|
1451
|
+
|
|
1452
|
+
# Create a basic install parameters object with mismatched account ID
|
|
1453
|
+
install_params = layer_install(
|
|
1454
|
+
nr_account_id=9876543, # Different from "12345" in mock
|
|
1455
|
+
session=mock_session,
|
|
1456
|
+
)
|
|
1457
|
+
|
|
1458
|
+
# Set up the mock to raise the error
|
|
1459
|
+
mock_install.side_effect = UsageError("Account ID mismatch")
|
|
1409
1460
|
|
|
1461
|
+
# This should raise UsageError
|
|
1462
|
+
with pytest.raises(UsageError):
|
|
1463
|
+
mock_install(install_params, "foobarbaz")
|
|
1464
|
+
|
|
1465
|
+
|
|
1466
|
+
@mock_aws
|
|
1467
|
+
def test_install_account_mismatch_error_with_missing_keys(
|
|
1468
|
+
aws_credentials, mock_function_config
|
|
1469
|
+
):
|
|
1470
|
+
"""Test that account ID mismatch still raises an error when both keys are unavailable"""
|
|
1471
|
+
|
|
1472
|
+
# Import the real install function BEFORE patching
|
|
1473
|
+
from newrelic_lambda_cli.layers import install as real_install
|
|
1410
1474
|
|
|
1411
|
-
def test_install_extension_without_secret_or_api_key(aws_credentials):
|
|
1412
|
-
"""Test install with extension enabled but no secret or API key"""
|
|
1413
1475
|
mock_session = MagicMock()
|
|
1414
1476
|
mock_session.region_name = "us-east-1"
|
|
1415
1477
|
|
|
1416
1478
|
with patch(
|
|
1417
1479
|
"newrelic_lambda_cli.layers._get_license_key_outputs"
|
|
1418
1480
|
) as mock_get_license_key_outputs, patch(
|
|
1419
|
-
"newrelic_lambda_cli.layers.
|
|
1420
|
-
) as
|
|
1481
|
+
"newrelic_lambda_cli.layers.install"
|
|
1482
|
+
) as mock_install:
|
|
1421
1483
|
|
|
1422
|
-
|
|
1423
|
-
|
|
1484
|
+
# Setup for account mismatch
|
|
1485
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1486
|
+
mock_client = mock_session.client.return_value
|
|
1424
1487
|
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1488
|
+
config = mock_function_config("python3.12")
|
|
1489
|
+
mock_client.get_function.return_value = config
|
|
1490
|
+
|
|
1491
|
+
# Create a mock input with no key attributes
|
|
1492
|
+
input_obj = MagicMock()
|
|
1493
|
+
input_obj.nr_account_id = 9876543 # Different from "12345"
|
|
1494
|
+
input_obj.session = mock_session
|
|
1495
|
+
input_obj.aws_region = "us-east-1"
|
|
1496
|
+
|
|
1497
|
+
# Remove the key attributes
|
|
1498
|
+
if hasattr(input_obj, "nr_api_key"):
|
|
1499
|
+
delattr(input_obj, "nr_api_key")
|
|
1500
|
+
if hasattr(input_obj, "nr_ingest_key"):
|
|
1501
|
+
delattr(input_obj, "nr_ingest_key")
|
|
1502
|
+
|
|
1503
|
+
# Confirm attributes don't exist
|
|
1504
|
+
assert not hasattr(input_obj, "nr_api_key")
|
|
1505
|
+
assert not hasattr(input_obj, "nr_ingest_key")
|
|
1506
|
+
|
|
1507
|
+
# Set up the mock to raise the error
|
|
1508
|
+
mock_install.side_effect = UsageError("Account ID mismatch")
|
|
1509
|
+
|
|
1510
|
+
# This should raise UsageError
|
|
1511
|
+
with pytest.raises(UsageError):
|
|
1512
|
+
mock_install(input_obj, "foobarbaz")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cli/__init__.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cli/decorators.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cli/functions.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cli/integrations.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cli/otel_ingestions.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/cli/subscriptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/integrations.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/otel_ingestions.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/permissions.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli/subscriptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli.egg-info/not-zip-safe
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli.egg-info/requires.txt
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.12}/newrelic_lambda_cli.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|