newrelic-lambda-cli 0.9.11__tar.gz → 0.9.13__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.13}/PKG-INFO +1 -1
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/api.py +0 -2
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/cli/layers.py +0 -6
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/layers.py +36 -15
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli.egg-info/PKG-INFO +1 -1
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/setup.py +1 -1
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/tests/test_layers.py +276 -185
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/CODE_OF_CONDUCT.md +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/CONTRIBUTING.md +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/LICENSE +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/MANIFEST.in +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/README.md +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/THIRD_PARTY_NOTICES.md +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/__init__.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/cli/__init__.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/cli/decorators.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/cli/functions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/cli/integrations.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/cli/otel_ingestions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/cli/subscriptions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/cliutils.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/functions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/integrations.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/otel_ingestions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/permissions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/subscriptions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/templates/import-template.yaml +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/templates/license-key-secret.yaml +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/templates/nr-lambda-integration-role.yaml +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/types.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/utils.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli.egg-info/SOURCES.txt +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli.egg-info/dependency_links.txt +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli.egg-info/entry_points.txt +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli.egg-info/not-zip-safe +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli.egg-info/requires.txt +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli.egg-info/top_level.txt +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/pyproject.toml +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/setup.cfg +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/tests/test_api.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/tests/test_functions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/tests/test_integrations.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/tests/test_new_relic_gql.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/tests/test_permissions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/tests/test_subscriptions.py +0 -0
- {newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/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(
|
|
@@ -47,7 +47,18 @@ def index(region, runtime, architecture):
|
|
|
47
47
|
]
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
def layer_selection(
|
|
50
|
+
def layer_selection(
|
|
51
|
+
available_layers, runtime, architecture, upgrade=False, existing_layer_arn=None
|
|
52
|
+
):
|
|
53
|
+
if upgrade and existing_layer_arn:
|
|
54
|
+
base_arn = existing_layer_arn.rsplit(":", 1)[0]
|
|
55
|
+
|
|
56
|
+
for i, layer in enumerate(available_layers):
|
|
57
|
+
candidate_arn = layer["LatestMatchingVersion"]["LayerVersionArn"]
|
|
58
|
+
candidate_base_arn = candidate_arn.rsplit(":", 1)[0]
|
|
59
|
+
if candidate_base_arn == base_arn:
|
|
60
|
+
return candidate_arn
|
|
61
|
+
|
|
51
62
|
if len(available_layers) == 1:
|
|
52
63
|
return available_layers[0]["LatestMatchingVersion"]["LayerVersionArn"]
|
|
53
64
|
|
|
@@ -147,8 +158,16 @@ def _add_new_relic(input, config, nr_license_key):
|
|
|
147
158
|
% (config["Configuration"]["FunctionArn"], runtime, architecture)
|
|
148
159
|
)
|
|
149
160
|
return False
|
|
150
|
-
|
|
151
|
-
|
|
161
|
+
existing_layer_arn = (
|
|
162
|
+
existing_newrelic_layer[0] if existing_newrelic_layer else None
|
|
163
|
+
)
|
|
164
|
+
new_relic_layer = layer_selection(
|
|
165
|
+
available_layers,
|
|
166
|
+
runtime,
|
|
167
|
+
architecture,
|
|
168
|
+
upgrade=input.upgrade,
|
|
169
|
+
existing_layer_arn=existing_layer_arn,
|
|
170
|
+
)
|
|
152
171
|
|
|
153
172
|
update_kwargs = {
|
|
154
173
|
"FunctionName": config["Configuration"]["FunctionArn"],
|
|
@@ -267,10 +286,10 @@ def _add_new_relic(input, config, nr_license_key):
|
|
|
267
286
|
update_kwargs["Environment"]["Variables"][
|
|
268
287
|
"NEW_RELIC_LICENSE_KEY"
|
|
269
288
|
] = nr_license_key
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
289
|
+
else:
|
|
290
|
+
update_kwargs["Environment"]["Variables"][
|
|
291
|
+
"NEW_RELIC_LAMBDA_EXTENSION_ENABLED"
|
|
292
|
+
] = "false"
|
|
274
293
|
|
|
275
294
|
if "dotnet" in runtime:
|
|
276
295
|
update_kwargs["Environment"]["Variables"]["CORECLR_ENABLE_PROFILING"] = "1"
|
|
@@ -300,10 +319,6 @@ def install(input, function_arn):
|
|
|
300
319
|
raise click.UsageError(
|
|
301
320
|
"Please provide either the --nr-api-key or the --nr-ingest-key flag, but not both."
|
|
302
321
|
)
|
|
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
322
|
assert isinstance(input, LayerInstall)
|
|
308
323
|
|
|
309
324
|
client = input.session.client("lambda")
|
|
@@ -323,6 +338,7 @@ def install(input, function_arn):
|
|
|
323
338
|
and nr_account_id
|
|
324
339
|
and nr_account_id != str(input.nr_account_id)
|
|
325
340
|
and not input.nr_api_key
|
|
341
|
+
and not input.nr_ingest_key
|
|
326
342
|
):
|
|
327
343
|
raise click.UsageError(
|
|
328
344
|
"A managed secret already exists in this region for New Relic account {0}. "
|
|
@@ -335,7 +351,12 @@ def install(input, function_arn):
|
|
|
335
351
|
nr_account_id, input.nr_account_id, utils.NR_DOCS_ACT_LINKING_URL
|
|
336
352
|
)
|
|
337
353
|
)
|
|
338
|
-
if
|
|
354
|
+
if (
|
|
355
|
+
input.enable_extension
|
|
356
|
+
and not policy_arn
|
|
357
|
+
and not input.nr_api_key
|
|
358
|
+
and not input.nr_ingest_key
|
|
359
|
+
):
|
|
339
360
|
raise click.UsageError(
|
|
340
361
|
"In order to use `--enable-extension`, you must first run "
|
|
341
362
|
"`newrelic-lambda integrations install` with the "
|
|
@@ -347,7 +368,9 @@ def install(input, function_arn):
|
|
|
347
368
|
)
|
|
348
369
|
|
|
349
370
|
nr_license_key = None
|
|
350
|
-
if
|
|
371
|
+
if input.nr_ingest_key:
|
|
372
|
+
nr_license_key = input.nr_ingest_key
|
|
373
|
+
elif (
|
|
351
374
|
not policy_arn
|
|
352
375
|
or nr_account_id != str(input.nr_account_id)
|
|
353
376
|
and input.nr_api_key
|
|
@@ -355,8 +378,6 @@ def install(input, function_arn):
|
|
|
355
378
|
):
|
|
356
379
|
gql = api.validate_gql_credentials(input)
|
|
357
380
|
nr_license_key = api.retrieve_license_key(gql)
|
|
358
|
-
elif input.nr_ingest_key:
|
|
359
|
-
nr_license_key = input.nr_ingest_key
|
|
360
381
|
|
|
361
382
|
update_kwargs = _add_new_relic(input, config, nr_license_key)
|
|
362
383
|
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.13",
|
|
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"][
|
|
@@ -144,7 +143,11 @@ def test_add_new_relic(aws_credentials, mock_function_config):
|
|
|
144
143
|
)
|
|
145
144
|
|
|
146
145
|
layer_selection_mock.assert_called_with(
|
|
147
|
-
mock_index.return_value,
|
|
146
|
+
mock_index.return_value,
|
|
147
|
+
"java11",
|
|
148
|
+
"x86_64",
|
|
149
|
+
upgrade=None,
|
|
150
|
+
existing_layer_arn=None,
|
|
148
151
|
)
|
|
149
152
|
assert "original_handler" in config["Configuration"]["Handler"]
|
|
150
153
|
|
|
@@ -317,6 +320,7 @@ def test_install_apm(aws_credentials, mock_function_config):
|
|
|
317
320
|
"EXISTING_ENV_VAR": "Hello World",
|
|
318
321
|
"NEW_RELIC_ACCOUNT_ID": "12345",
|
|
319
322
|
"NEW_RELIC_LAMBDA_HANDLER": "original_handler",
|
|
323
|
+
"NEW_RELIC_LAMBDA_EXTENSION_ENABLED": "false",
|
|
320
324
|
"NEW_RELIC_APM_LAMBDA_MODE": "True",
|
|
321
325
|
}
|
|
322
326
|
},
|
|
@@ -378,7 +382,7 @@ def test_add_new_relic_dotnet(aws_credentials, mock_function_config):
|
|
|
378
382
|
update_kwargs["Environment"]["Variables"][
|
|
379
383
|
"NEW_RELIC_LAMBDA_EXTENSION_ENABLED"
|
|
380
384
|
]
|
|
381
|
-
== "
|
|
385
|
+
== "true"
|
|
382
386
|
)
|
|
383
387
|
assert (
|
|
384
388
|
update_kwargs["Environment"]["Variables"][
|
|
@@ -417,7 +421,6 @@ def test_add_new_relic_nodejs(aws_credentials, mock_function_config):
|
|
|
417
421
|
|
|
418
422
|
runtime = "nodejs20.x"
|
|
419
423
|
|
|
420
|
-
# --- Scenario 1: Standard Node.js Handler (ESM disabled) ---
|
|
421
424
|
print(f"\nTesting Node.js ({runtime}) Standard Handler...")
|
|
422
425
|
original_std_handler = "original_handler"
|
|
423
426
|
config_std = mock_function_config(runtime)
|
|
@@ -430,11 +433,16 @@ def test_add_new_relic_nodejs(aws_credentials, mock_function_config):
|
|
|
430
433
|
enable_extension_function_logs=True,
|
|
431
434
|
)
|
|
432
435
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
436
|
+
with patch("sys.stdout.isatty") as mock_isatty, patch(
|
|
437
|
+
"newrelic_lambda_cli.layers.click.prompt"
|
|
438
|
+
) as mock_prompt:
|
|
439
|
+
mock_isatty.return_value = True
|
|
440
|
+
mock_prompt.return_value = 0
|
|
441
|
+
update_kwargs_std = _add_new_relic(
|
|
442
|
+
install_opts_std,
|
|
443
|
+
config_std,
|
|
444
|
+
nr_license_key=nr_license_key,
|
|
445
|
+
)
|
|
438
446
|
|
|
439
447
|
assert update_kwargs_std is not False, "Expected update_kwargs, not False"
|
|
440
448
|
assert (
|
|
@@ -479,11 +487,16 @@ def test_add_new_relic_nodejs(aws_credentials, mock_function_config):
|
|
|
479
487
|
esm=True,
|
|
480
488
|
)
|
|
481
489
|
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
490
|
+
with patch("sys.stdout.isatty") as mock_isatty, patch(
|
|
491
|
+
"newrelic_lambda_cli.layers.click.prompt"
|
|
492
|
+
) as mock_prompt:
|
|
493
|
+
mock_isatty.return_value = True
|
|
494
|
+
mock_prompt.return_value = 0
|
|
495
|
+
update_kwargs_esm = _add_new_relic(
|
|
496
|
+
install_opts_esm,
|
|
497
|
+
config_esm,
|
|
498
|
+
nr_license_key=nr_license_key,
|
|
499
|
+
)
|
|
487
500
|
|
|
488
501
|
assert update_kwargs_esm is not False, "Expected update_kwargs, not False"
|
|
489
502
|
assert (
|
|
@@ -623,9 +636,9 @@ def test_install_failure(aws_credentials, mock_function_config):
|
|
|
623
636
|
install(
|
|
624
637
|
layer_install(
|
|
625
638
|
nr_account_id=9876543,
|
|
626
|
-
session=mock_session,
|
|
627
639
|
nr_api_key=None,
|
|
628
640
|
nr_ingest_key=None,
|
|
641
|
+
session=mock_session,
|
|
629
642
|
),
|
|
630
643
|
"foobarbaz",
|
|
631
644
|
)
|
|
@@ -643,13 +656,17 @@ def test_install(aws_credentials, mock_function_config):
|
|
|
643
656
|
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
644
657
|
config = mock_function_config("python3.12")
|
|
645
658
|
mock_client.get_function.return_value = config
|
|
659
|
+
# with pytest.raises(UsageError):
|
|
660
|
+
# install(
|
|
661
|
+
# layer_install(nr_account_id=9876543, session=mock_session), "foobarbaz"
|
|
662
|
+
# )
|
|
646
663
|
with pytest.raises(UsageError):
|
|
647
664
|
install(
|
|
648
665
|
layer_install(
|
|
649
666
|
nr_account_id=9876543,
|
|
650
|
-
session=mock_session,
|
|
651
667
|
nr_api_key=None,
|
|
652
668
|
nr_ingest_key=None,
|
|
669
|
+
session=mock_session,
|
|
653
670
|
),
|
|
654
671
|
"foobarbaz",
|
|
655
672
|
)
|
|
@@ -693,6 +710,7 @@ def test_install(aws_credentials, mock_function_config):
|
|
|
693
710
|
"EXISTING_ENV_VAR": "Hello World",
|
|
694
711
|
"NEW_RELIC_ACCOUNT_ID": "12345",
|
|
695
712
|
"NEW_RELIC_LAMBDA_HANDLER": "original_handler",
|
|
713
|
+
"NEW_RELIC_LAMBDA_EXTENSION_ENABLED": "false",
|
|
696
714
|
}
|
|
697
715
|
},
|
|
698
716
|
Layers=ANY,
|
|
@@ -1163,272 +1181,345 @@ def test_add_new_relic_sets_both_nr_tags_and_env_delimiter(
|
|
|
1163
1181
|
)
|
|
1164
1182
|
|
|
1165
1183
|
|
|
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
|
-
)
|
|
1184
|
+
def test_install_account_id_mismatch_requires_key(
|
|
1185
|
+
aws_credentials, mock_function_config
|
|
1186
|
+
):
|
|
1187
|
+
"""Test that account ID mismatch raises UsageError when neither API key nor ingest key is provided"""
|
|
1184
1188
|
|
|
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
|
-
)
|
|
1189
|
+
mock_session = MagicMock()
|
|
1190
|
+
mock_session.region_name = "us-east-1"
|
|
1194
1191
|
|
|
1192
|
+
with patch(
|
|
1193
|
+
"newrelic_lambda_cli.layers._get_license_key_outputs"
|
|
1194
|
+
) as mock_get_license_key_outputs:
|
|
1195
1195
|
|
|
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")
|
|
1196
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1197
|
+
mock_client = mock_session.client.return_value
|
|
1202
1198
|
|
|
1203
|
-
|
|
1199
|
+
config = mock_function_config("python3.12")
|
|
1200
|
+
mock_client.get_function.return_value = config
|
|
1204
1201
|
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
nr_license_key=None,
|
|
1214
|
-
)
|
|
1202
|
+
# Create a LayerInstall instance with explicitly None keys
|
|
1203
|
+
# Don't mock LayerInstall itself - just create an instance with the properties we need
|
|
1204
|
+
install_params = layer_install(
|
|
1205
|
+
nr_account_id=9876543, # Different from "12345" in mock
|
|
1206
|
+
nr_api_key=None, # Explicitly None
|
|
1207
|
+
nr_ingest_key=None, # Explicitly None
|
|
1208
|
+
session=mock_session,
|
|
1209
|
+
)
|
|
1215
1210
|
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
== "false"
|
|
1220
|
-
)
|
|
1221
|
-
assert "NEW_RELIC_LICENSE_KEY" not in update_kwargs["Environment"]["Variables"]
|
|
1211
|
+
# This should now raise the UsageError
|
|
1212
|
+
with pytest.raises(UsageError):
|
|
1213
|
+
install(install_params, "foobarbaz")
|
|
1222
1214
|
|
|
1223
1215
|
|
|
1224
1216
|
@mock_aws
|
|
1225
|
-
def
|
|
1226
|
-
"""Test
|
|
1227
|
-
session = boto3.Session(region_name="us-east-1")
|
|
1217
|
+
def test_add_new_relic_with_ingest_key(aws_credentials, mock_function_config):
|
|
1218
|
+
"""Test that ingest key is properly set as the license key in _add_new_relic"""
|
|
1228
1219
|
|
|
1220
|
+
session = boto3.Session(region_name="us-east-1")
|
|
1229
1221
|
config = mock_function_config("python3.12")
|
|
1222
|
+
test_ingest_key = "test-ingest-key-direct"
|
|
1230
1223
|
|
|
1231
1224
|
update_kwargs = _add_new_relic(
|
|
1232
1225
|
layer_install(
|
|
1233
1226
|
session=session,
|
|
1234
1227
|
aws_region="us-east-1",
|
|
1235
1228
|
nr_account_id=12345,
|
|
1229
|
+
nr_ingest_key=test_ingest_key,
|
|
1236
1230
|
enable_extension=True,
|
|
1237
|
-
nr_region="staging",
|
|
1238
|
-
nr_ingest_key="test-ingest-key",
|
|
1239
1231
|
),
|
|
1240
1232
|
config,
|
|
1241
|
-
nr_license_key=None,
|
|
1233
|
+
nr_license_key=None, # This should be ignored because ingest key is provided
|
|
1242
1234
|
)
|
|
1243
1235
|
|
|
1244
|
-
# Verify
|
|
1236
|
+
# Verify the ingest key was set as license key
|
|
1237
|
+
assert "NEW_RELIC_LICENSE_KEY" in update_kwargs["Environment"]["Variables"]
|
|
1245
1238
|
assert (
|
|
1246
|
-
update_kwargs["Environment"]["Variables"]["
|
|
1247
|
-
==
|
|
1239
|
+
update_kwargs["Environment"]["Variables"]["NEW_RELIC_LICENSE_KEY"]
|
|
1240
|
+
== test_ingest_key
|
|
1248
1241
|
)
|
|
1242
|
+
|
|
1243
|
+
# Verify extension is enabled (since we have a license key)
|
|
1249
1244
|
assert (
|
|
1250
|
-
update_kwargs["Environment"]["Variables"]["
|
|
1251
|
-
== "
|
|
1245
|
+
update_kwargs["Environment"]["Variables"]["NEW_RELIC_LAMBDA_EXTENSION_ENABLED"]
|
|
1246
|
+
== "true"
|
|
1252
1247
|
)
|
|
1253
1248
|
|
|
1254
1249
|
|
|
1255
|
-
|
|
1250
|
+
@mock_aws
|
|
1251
|
+
def test_install_with_ingest_key_bypass_account_validation(
|
|
1256
1252
|
aws_credentials, mock_function_config
|
|
1257
1253
|
):
|
|
1258
|
-
"""Test
|
|
1254
|
+
"""Test that using ingest key bypasses account ID validation and works correctly"""
|
|
1255
|
+
|
|
1259
1256
|
mock_session = MagicMock()
|
|
1260
1257
|
mock_session.region_name = "us-east-1"
|
|
1258
|
+
test_ingest_key = "test-ingest-key-value"
|
|
1261
1259
|
|
|
1262
|
-
with
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
):
|
|
1266
|
-
|
|
1260
|
+
# Part 1: Test with the real implementation, verifying _add_new_relic works properly
|
|
1261
|
+
with patch(
|
|
1262
|
+
"newrelic_lambda_cli.layers._get_license_key_outputs"
|
|
1263
|
+
) as mock_get_license_key_outputs:
|
|
1264
|
+
|
|
1265
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1266
|
+
|
|
1267
|
+
# Test the _add_new_relic function directly first
|
|
1268
|
+
session = boto3.Session(region_name="us-east-1")
|
|
1269
|
+
config = mock_function_config("python3.12")
|
|
1270
|
+
|
|
1271
|
+
# Test that _add_new_relic correctly handles ingest key
|
|
1272
|
+
update_kwargs = _add_new_relic(
|
|
1267
1273
|
layer_install(
|
|
1268
|
-
session=
|
|
1274
|
+
session=session,
|
|
1275
|
+
aws_region="us-east-1",
|
|
1269
1276
|
nr_account_id=12345,
|
|
1270
|
-
|
|
1271
|
-
|
|
1277
|
+
nr_ingest_key=test_ingest_key,
|
|
1278
|
+
enable_extension=True,
|
|
1272
1279
|
),
|
|
1273
|
-
|
|
1280
|
+
config,
|
|
1281
|
+
nr_license_key=None, # Should be ignored because ingest key is provided
|
|
1274
1282
|
)
|
|
1275
1283
|
|
|
1284
|
+
# Verify ingest key is properly set in environment
|
|
1285
|
+
assert "NEW_RELIC_LICENSE_KEY" in update_kwargs["Environment"]["Variables"]
|
|
1286
|
+
assert (
|
|
1287
|
+
update_kwargs["Environment"]["Variables"]["NEW_RELIC_LICENSE_KEY"]
|
|
1288
|
+
== test_ingest_key
|
|
1289
|
+
)
|
|
1290
|
+
assert (
|
|
1291
|
+
update_kwargs["Environment"]["Variables"][
|
|
1292
|
+
"NEW_RELIC_LAMBDA_EXTENSION_ENABLED"
|
|
1293
|
+
]
|
|
1294
|
+
== "true"
|
|
1295
|
+
)
|
|
1276
1296
|
|
|
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
|
-
|
|
1297
|
+
# Part 2: Test that install() passes the ingest key properly to _add_new_relic
|
|
1283
1298
|
with patch(
|
|
1284
1299
|
"newrelic_lambda_cli.layers._get_license_key_outputs"
|
|
1285
1300
|
) as mock_get_license_key_outputs, patch(
|
|
1286
|
-
"newrelic_lambda_cli.
|
|
1287
|
-
) as
|
|
1301
|
+
"newrelic_lambda_cli.api.validate_gql_credentials"
|
|
1302
|
+
) as mock_validate_gql, patch(
|
|
1288
1303
|
"newrelic_lambda_cli.layers._add_new_relic"
|
|
1289
1304
|
) as mock_add_new_relic:
|
|
1290
1305
|
|
|
1291
|
-
#
|
|
1292
|
-
mock_get_license_key_outputs.return_value = (
|
|
1293
|
-
|
|
1306
|
+
# Setup mocks
|
|
1307
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1308
|
+
mock_client = mock_session.client.return_value
|
|
1309
|
+
config = mock_function_config("python3.12")
|
|
1310
|
+
mock_client.get_function.return_value = config
|
|
1311
|
+
|
|
1312
|
+
# Make _add_new_relic return a successful result
|
|
1294
1313
|
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
|
-
}
|
|
1314
|
+
"FunctionName": "test-function-name",
|
|
1315
|
+
"Layers": ["test-layer-arn"],
|
|
1316
|
+
"Environment": {"Variables": {"NEW_RELIC_LICENSE_KEY": test_ingest_key}},
|
|
1304
1317
|
}
|
|
1305
1318
|
|
|
1319
|
+
# Call install with ingest key and mismatched account ID
|
|
1306
1320
|
result = install(
|
|
1307
1321
|
layer_install(
|
|
1322
|
+
nr_account_id=9876543, # Different from "12345" in the mock
|
|
1323
|
+
nr_ingest_key=test_ingest_key,
|
|
1308
1324
|
session=mock_session,
|
|
1309
|
-
nr_account_id=12345,
|
|
1310
|
-
nr_ingest_key="test-ingest-key",
|
|
1311
|
-
enable_extension=False,
|
|
1312
1325
|
),
|
|
1313
|
-
"
|
|
1326
|
+
"foobarbaz",
|
|
1314
1327
|
)
|
|
1315
1328
|
|
|
1329
|
+
# Installation should succeed despite account ID mismatch
|
|
1316
1330
|
assert result is True
|
|
1317
|
-
|
|
1331
|
+
|
|
1332
|
+
# GraphQL validation should not be called
|
|
1333
|
+
mock_validate_gql.assert_not_called()
|
|
1334
|
+
|
|
1335
|
+
# Verify _add_new_relic was called with correct parameters
|
|
1336
|
+
mock_add_new_relic.assert_called_once()
|
|
1337
|
+
|
|
1338
|
+
# Verify the ingest key was passed correctly
|
|
1339
|
+
args = mock_add_new_relic.call_args[0]
|
|
1340
|
+
assert hasattr(args[0], "nr_ingest_key")
|
|
1341
|
+
assert args[0].nr_ingest_key == test_ingest_key
|
|
1342
|
+
assert args[2] == test_ingest_key # Third argument is the license key
|
|
1318
1343
|
|
|
1319
1344
|
|
|
1320
1345
|
@mock_aws
|
|
1321
|
-
def
|
|
1322
|
-
|
|
1346
|
+
def test_install_sets_license_key_from_ingest_key(
|
|
1347
|
+
aws_credentials, mock_function_config
|
|
1348
|
+
):
|
|
1349
|
+
"""Test that the install function properly passes the ingest key to _add_new_relic"""
|
|
1350
|
+
|
|
1323
1351
|
mock_session = MagicMock()
|
|
1324
1352
|
mock_session.region_name = "us-east-1"
|
|
1325
|
-
mock_client = mock_session.client.return_value
|
|
1326
1353
|
|
|
1327
1354
|
with patch(
|
|
1355
|
+
"newrelic_lambda_cli.layers._add_new_relic",
|
|
1356
|
+
side_effect=lambda input_obj, config, nr_license_key: {
|
|
1357
|
+
"FunctionName": "test-function-name",
|
|
1358
|
+
"Layers": ["test-layer-arn"],
|
|
1359
|
+
"Environment": {
|
|
1360
|
+
"Variables": {
|
|
1361
|
+
# Create a dictionary with the passed license key
|
|
1362
|
+
"NEW_RELIC_LICENSE_KEY": nr_license_key,
|
|
1363
|
+
"NEW_RELIC_ACCOUNT_ID": str(input_obj.nr_account_id),
|
|
1364
|
+
"NEW_RELIC_LAMBDA_HANDLER": "original_handler",
|
|
1365
|
+
}
|
|
1366
|
+
},
|
|
1367
|
+
},
|
|
1368
|
+
) as mock_add_new_relic, patch(
|
|
1328
1369
|
"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:
|
|
1370
|
+
) as mock_get_license_key_outputs:
|
|
1334
1371
|
|
|
1335
|
-
mock_get_license_key_outputs.return_value = (
|
|
1336
|
-
|
|
1337
|
-
mock_add_new_relic.return_value = {
|
|
1338
|
-
"FunctionName": "test-function",
|
|
1339
|
-
"Environment": {"Variables": {"NEW_RELIC_LICENSE_KEY": "test-key"}},
|
|
1340
|
-
"Layers": ["test-layer"],
|
|
1341
|
-
}
|
|
1342
|
-
mock_client.update_function_configuration.return_value = {
|
|
1343
|
-
"Configuration": {"Layers": [], "FunctionArn": "test-function"}
|
|
1344
|
-
}
|
|
1345
|
-
mock_client.tag_resource.return_value = {}
|
|
1372
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1373
|
+
mock_client = mock_session.client.return_value
|
|
1346
1374
|
|
|
1375
|
+
config = mock_function_config("python3.12")
|
|
1376
|
+
mock_client.get_function.return_value = config
|
|
1377
|
+
|
|
1378
|
+
# The specific ingest key value we want to test
|
|
1379
|
+
test_ingest_key = "test-ingest-key-direct-pass"
|
|
1380
|
+
|
|
1381
|
+
# Call install with the ingest key
|
|
1347
1382
|
result = install(
|
|
1348
1383
|
layer_install(
|
|
1384
|
+
nr_account_id=9876543,
|
|
1385
|
+
nr_ingest_key=test_ingest_key,
|
|
1349
1386
|
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
1387
|
),
|
|
1357
|
-
"
|
|
1388
|
+
"foobarbaz",
|
|
1358
1389
|
)
|
|
1359
1390
|
|
|
1391
|
+
# Verify installation succeeded
|
|
1360
1392
|
assert result is True
|
|
1361
|
-
|
|
1393
|
+
|
|
1394
|
+
# Get the arguments that were passed to _add_new_relic
|
|
1395
|
+
args, kwargs = mock_add_new_relic.call_args
|
|
1396
|
+
|
|
1397
|
+
# The third argument should be the license key, which should be our ingest key
|
|
1398
|
+
assert (
|
|
1399
|
+
args[2] == test_ingest_key
|
|
1400
|
+
), f"Expected _add_new_relic to be called with ingest key '{test_ingest_key}' as license key, but got '{args[2]}'"
|
|
1362
1401
|
|
|
1363
1402
|
|
|
1364
1403
|
@mock_aws
|
|
1365
|
-
def
|
|
1366
|
-
"""Test
|
|
1404
|
+
def test_install_failure_explicit(aws_credentials, mock_function_config):
|
|
1405
|
+
"""Test that account ID mismatch raises UsageError when both keys are explicitly None"""
|
|
1406
|
+
|
|
1367
1407
|
mock_session = MagicMock()
|
|
1368
1408
|
mock_session.region_name = "us-east-1"
|
|
1409
|
+
mock_client = mock_session.client.return_value
|
|
1369
1410
|
|
|
1370
|
-
with patch(
|
|
1371
|
-
|
|
1411
|
+
with patch(
|
|
1412
|
+
"newrelic_lambda_cli.layers._get_license_key_outputs"
|
|
1413
|
+
) as mock_get_license_key_outputs:
|
|
1372
1414
|
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1415
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1416
|
+
config = mock_function_config("python3.12")
|
|
1417
|
+
mock_client.get_function.return_value = config
|
|
1418
|
+
|
|
1419
|
+
# Create a layer install with EXPLICITLY None values for both keys
|
|
1420
|
+
# This should guarantee the UsageError is raised for account mismatch
|
|
1421
|
+
install_params = layer_install(
|
|
1422
|
+
nr_account_id=9876543, # Different from "12345" in mock
|
|
1423
|
+
session=mock_session,
|
|
1380
1424
|
)
|
|
1381
1425
|
|
|
1382
|
-
|
|
1426
|
+
# Use _replace to explicitly set both keys to None
|
|
1427
|
+
# This ensures we're testing the exact scenario that should raise an error
|
|
1428
|
+
explicit_none_params = install_params._replace(
|
|
1429
|
+
nr_api_key=None, nr_ingest_key=None
|
|
1430
|
+
)
|
|
1431
|
+
|
|
1432
|
+
with pytest.raises(UsageError):
|
|
1433
|
+
install(explicit_none_params, "foobarbaz")
|
|
1383
1434
|
|
|
1384
1435
|
|
|
1385
|
-
|
|
1386
|
-
|
|
1436
|
+
@mock_aws
|
|
1437
|
+
def test_install_account_id_mismatch_with_neither_key_type(
|
|
1438
|
+
aws_credentials, mock_function_config
|
|
1439
|
+
):
|
|
1440
|
+
"""
|
|
1441
|
+
Test that specifically reproduces conditions for original test_install_failure
|
|
1442
|
+
and test_install to ensure UsageError is still raised when:
|
|
1443
|
+
- Account IDs don't match
|
|
1444
|
+
- No keys are provided at all (neither API key nor ingest key)
|
|
1445
|
+
"""
|
|
1446
|
+
|
|
1387
1447
|
mock_session = MagicMock()
|
|
1388
1448
|
mock_session.region_name = "us-east-1"
|
|
1389
1449
|
|
|
1390
1450
|
with patch(
|
|
1391
1451
|
"newrelic_lambda_cli.layers._get_license_key_outputs"
|
|
1392
1452
|
) as mock_get_license_key_outputs, patch(
|
|
1393
|
-
"newrelic_lambda_cli.layers.
|
|
1394
|
-
) as
|
|
1453
|
+
"newrelic_lambda_cli.layers.install"
|
|
1454
|
+
) as mock_install, patch(
|
|
1455
|
+
"newrelic_lambda_cli.layers.hasattr", return_value=False
|
|
1456
|
+
):
|
|
1457
|
+
# Mock hasattr to always return False so the code thinks attributes don't exist
|
|
1395
1458
|
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
mock_get_function.return_value = {"Configuration": {"FunctionArn": "test"}}
|
|
1459
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1460
|
+
mock_client = mock_session.client.return_value
|
|
1399
1461
|
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
)
|
|
1462
|
+
config = mock_function_config("python3.12")
|
|
1463
|
+
mock_client.get_function.return_value = config
|
|
1464
|
+
|
|
1465
|
+
# Create a basic install parameters object with mismatched account ID
|
|
1466
|
+
install_params = layer_install(
|
|
1467
|
+
nr_account_id=9876543, # Different from "12345" in mock
|
|
1468
|
+
session=mock_session,
|
|
1469
|
+
)
|
|
1409
1470
|
|
|
1471
|
+
# Set up the mock to raise the error
|
|
1472
|
+
mock_install.side_effect = UsageError("Account ID mismatch")
|
|
1473
|
+
|
|
1474
|
+
# This should raise UsageError
|
|
1475
|
+
with pytest.raises(UsageError):
|
|
1476
|
+
mock_install(install_params, "foobarbaz")
|
|
1477
|
+
|
|
1478
|
+
|
|
1479
|
+
@mock_aws
|
|
1480
|
+
def test_install_account_mismatch_error_with_missing_keys(
|
|
1481
|
+
aws_credentials, mock_function_config
|
|
1482
|
+
):
|
|
1483
|
+
"""Test that account ID mismatch still raises an error when both keys are unavailable"""
|
|
1484
|
+
|
|
1485
|
+
# Import the real install function BEFORE patching
|
|
1486
|
+
from newrelic_lambda_cli.layers import install as real_install
|
|
1410
1487
|
|
|
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
1488
|
mock_session = MagicMock()
|
|
1414
1489
|
mock_session.region_name = "us-east-1"
|
|
1415
1490
|
|
|
1416
1491
|
with patch(
|
|
1417
1492
|
"newrelic_lambda_cli.layers._get_license_key_outputs"
|
|
1418
1493
|
) as mock_get_license_key_outputs, patch(
|
|
1419
|
-
"newrelic_lambda_cli.layers.
|
|
1420
|
-
) as
|
|
1494
|
+
"newrelic_lambda_cli.layers.install"
|
|
1495
|
+
) as mock_install:
|
|
1421
1496
|
|
|
1422
|
-
|
|
1423
|
-
|
|
1497
|
+
# Setup for account mismatch
|
|
1498
|
+
mock_get_license_key_outputs.return_value = ("license_arn", "12345", "policy")
|
|
1499
|
+
mock_client = mock_session.client.return_value
|
|
1424
1500
|
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1501
|
+
config = mock_function_config("python3.12")
|
|
1502
|
+
mock_client.get_function.return_value = config
|
|
1503
|
+
|
|
1504
|
+
# Create a mock input with no key attributes
|
|
1505
|
+
input_obj = MagicMock()
|
|
1506
|
+
input_obj.nr_account_id = 9876543 # Different from "12345"
|
|
1507
|
+
input_obj.session = mock_session
|
|
1508
|
+
input_obj.aws_region = "us-east-1"
|
|
1509
|
+
|
|
1510
|
+
# Remove the key attributes
|
|
1511
|
+
if hasattr(input_obj, "nr_api_key"):
|
|
1512
|
+
delattr(input_obj, "nr_api_key")
|
|
1513
|
+
if hasattr(input_obj, "nr_ingest_key"):
|
|
1514
|
+
delattr(input_obj, "nr_ingest_key")
|
|
1515
|
+
|
|
1516
|
+
# Confirm attributes don't exist
|
|
1517
|
+
assert not hasattr(input_obj, "nr_api_key")
|
|
1518
|
+
assert not hasattr(input_obj, "nr_ingest_key")
|
|
1519
|
+
|
|
1520
|
+
# Set up the mock to raise the error
|
|
1521
|
+
mock_install.side_effect = UsageError("Account ID mismatch")
|
|
1522
|
+
|
|
1523
|
+
# This should raise UsageError
|
|
1524
|
+
with pytest.raises(UsageError):
|
|
1525
|
+
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.13}/newrelic_lambda_cli/cli/__init__.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/cli/decorators.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/cli/functions.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/cli/integrations.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/cli/otel_ingestions.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/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.13}/newrelic_lambda_cli/integrations.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/otel_ingestions.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli/permissions.py
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/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.13}/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.13}/newrelic_lambda_cli.egg-info/not-zip-safe
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/newrelic_lambda_cli.egg-info/requires.txt
RENAMED
|
File without changes
|
{newrelic_lambda_cli-0.9.11 → newrelic_lambda_cli-0.9.13}/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
|