Skip to content

Commit 398539e

Browse files
committed
add order of precedence test for config_loader
1 parent 815b415 commit 398539e

File tree

3 files changed

+167
-1
lines changed

3 files changed

+167
-1
lines changed

st2common/tests/unit/test_config_loader.py

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ def test_get_config_dynamic_config_item_under_pattern_properties(self):
587587
)
588588

589589
####################
590-
# values in objects under an object with additionalProperties
590+
# values in objects under an object with patternProperties
591591
values = {
592592
"profiles": {
593593
"dev": {
@@ -630,6 +630,105 @@ def test_get_config_dynamic_config_item_under_pattern_properties(self):
630630

631631
config_db.delete()
632632

633+
def test_get_config_dynamic_config_item_properties_order_of_precedence(self):
634+
pack_name = "dummy_pack_schema_with_properties_1"
635+
loader = ContentPackConfigLoader(pack_name=pack_name)
636+
637+
encrypted_value = crypto.symmetric_encrypt(
638+
KeyValuePairAPI.crypto_key, "v1_encrypted"
639+
)
640+
KeyValuePair.add_or_update(
641+
KeyValuePairDB(name="k1_encrypted", value=encrypted_value, secret=True)
642+
)
643+
KeyValuePair.add_or_update(
644+
KeyValuePairDB(name="k2_encrypted", value=encrypted_value, secret=True)
645+
)
646+
KeyValuePair.add_or_update(
647+
KeyValuePairDB(name="k3_encrypted", value=encrypted_value, secret=True)
648+
)
649+
650+
####################
651+
# values in objects under an object with additionalProperties
652+
values = {
653+
"profiles": {
654+
# properties
655+
"foo": {
656+
"domain": "foo.example.com",
657+
"token": "hard-coded-secret",
658+
},
659+
"bar": {
660+
"domain": "bar.example.com",
661+
"token": "{{st2kv.system.k1_encrypted}}",
662+
},
663+
# patternProperties start with env-
664+
"env-dev": {
665+
"host": "127.0.0.127",
666+
"token": "hard-coded-secret",
667+
},
668+
"env-prod": {
669+
"host": "127.1.2.7",
670+
"port": 8282,
671+
# encrypted in datastore
672+
"token": "{{st2kv.system.k2_encrypted}}",
673+
# schema declares `secret: true` which triggers auto-decryption.
674+
# If this were not encrypted, it would try to decrypt it and fail.
675+
},
676+
# additionalProperties
677+
"dev": {
678+
"url": "https://example.com",
679+
"token": "hard-coded-secret",
680+
},
681+
"prod": {
682+
"url": "https://other.example.com",
683+
"port": 2345,
684+
"token": "{{st2kv.system.k3_encrypted}}",
685+
},
686+
}
687+
}
688+
config_db = ConfigDB(pack=pack_name, values=values)
689+
config_db = Config.add_or_update(config_db)
690+
691+
config_rendered = loader.get_config()
692+
693+
self.assertEqual(
694+
config_rendered,
695+
{
696+
"region": "us-east-1",
697+
"profiles": {
698+
"foo": {
699+
"domain": "foo.example.com",
700+
"token": "hard-coded-secret",
701+
},
702+
"bar": {
703+
"domain": "bar.example.com",
704+
"token": "v1_encrypted",
705+
},
706+
"env-dev": {
707+
"host": "127.0.0.127",
708+
"port": 8080,
709+
"token": "hard-coded-secret",
710+
},
711+
"env-prod": {
712+
"host": "127.1.2.7",
713+
"port": 8282,
714+
"token": "v1_encrypted",
715+
},
716+
"dev": {
717+
"url": "https://example.com",
718+
"port": 1234,
719+
"token": "hard-coded-secret",
720+
},
721+
"prod": {
722+
"url": "https://other.example.com",
723+
"port": 2345,
724+
"token": "v1_encrypted",
725+
},
726+
},
727+
},
728+
)
729+
730+
config_db.delete()
731+
633732
def test_get_config_dynamic_config_item_under_additional_items(self):
634733
pack_name = "dummy_pack_schema_with_additional_items_1"
635734
loader = ContentPackConfigLoader(pack_name=pack_name)
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
---
2+
region:
3+
type: "string"
4+
required: false
5+
default: "us-east-1"
6+
profiles:
7+
type: "object"
8+
required: false
9+
# order of precedence: properties, patternProperties, additionalProperties
10+
properties:
11+
foo:
12+
type: object
13+
properties:
14+
domain:
15+
type: "string"
16+
required: true
17+
token:
18+
type: "string"
19+
required: true
20+
secret: true
21+
bar:
22+
type: object
23+
properties:
24+
domain:
25+
type: "string"
26+
required: true
27+
token:
28+
type: "string"
29+
required: true
30+
secret: true
31+
patternProperties:
32+
"^env-\\w+$":
33+
type: object
34+
additionalProperties: false
35+
properties:
36+
host:
37+
type: "string"
38+
required: true
39+
port:
40+
type: "integer"
41+
required: false
42+
default: 8080
43+
token:
44+
type: "string"
45+
required: true
46+
secret: true
47+
additionalProperties:
48+
type: object
49+
additionalProperties: false
50+
properties:
51+
url:
52+
type: "string"
53+
required: true
54+
port:
55+
type: "integer"
56+
required: false
57+
default: 1234
58+
token:
59+
type: "string"
60+
required: true
61+
secret: true
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
name : dummy_pack_schema_with_pattern_and_additional_properties_1
3+
description : dummy pack with nested objects under patternProperties and additionalProperties
4+
version : 0.1.0
5+
author : st2-dev
6+

0 commit comments

Comments
 (0)