Skip to content

Commit 85238f4

Browse files
committed
Add support for overriding AqMetadata tags from VM meta
Adds support to the dataclass for overriding tags based on VM Metadata. We also map a sandbox reference back to a domain instead
1 parent 961f0e4 commit 85238f4

File tree

6 files changed

+123
-24
lines changed

6 files changed

+123
-24
lines changed

OpenStack-Rabbit-Consumer/rabbit_consumer/aq_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from urllib3.util.retry import Retry
99

1010
from rabbit_consumer.consumer_config import ConsumerConfig
11-
from rabbit_consumer.build_metadata import AqMetadata
11+
from rabbit_consumer.aq_metadata import AqMetadata
1212
from rabbit_consumer.openstack_address import OpenstackAddress
1313
from rabbit_consumer.rabbit_message import RabbitMessage
1414
from rabbit_consumer.vm_data import VmData
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import logging
2+
from dataclasses import dataclass
3+
from typing import Dict
4+
5+
from mashumaro import DataClassDictMixin
6+
from mashumaro.config import BaseConfig
7+
8+
logger = logging.getLogger(__name__)
9+
10+
11+
@dataclass
12+
class AqMetadata(DataClassDictMixin):
13+
"""
14+
Deserialised metadata that is set either on an Openstack image
15+
or a VM's metadata
16+
"""
17+
18+
aq_archetype: str
19+
# Aq domain can hold either a domain or sandbox reference
20+
aq_domain: str
21+
22+
aq_personality: str
23+
aq_os_version: str
24+
aq_os: str
25+
26+
class Config(BaseConfig):
27+
aliases = {
28+
"aq_archetype": "AQ_ARCHETYPE",
29+
"aq_domain": "AQ_DOMAIN",
30+
"aq_personality": "AQ_PERSONALITY",
31+
"aq_os_version": "AQ_OSVERSION",
32+
"aq_os": "AQ_OS",
33+
}
34+
35+
def override_from_vm_meta(self, vm_meta: Dict[str, str]):
36+
"""
37+
Overrides the values in the metadata with the values from the VM's
38+
metadata
39+
"""
40+
for attr, alias in self.Config.aliases.items():
41+
if alias in vm_meta:
42+
setattr(self, attr, vm_meta[alias])
43+
44+
if "AQ_SANDBOX" in vm_meta:
45+
self.aq_domain = vm_meta["AQ_SANDBOX"]

OpenStack-Rabbit-Consumer/rabbit_consumer/build_metadata.py

Lines changed: 0 additions & 21 deletions
This file was deleted.

OpenStack-Rabbit-Consumer/rabbit_consumer/message_consumer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from rabbit_consumer import openstack_api
1010
from rabbit_consumer.aq_api import verify_kerberos_ticket
1111
from rabbit_consumer.consumer_config import ConsumerConfig
12-
from rabbit_consumer.build_metadata import AqMetadata
12+
from rabbit_consumer.aq_metadata import AqMetadata
1313
from rabbit_consumer.openstack_address import OpenstackAddress
1414
from rabbit_consumer.rabbit_message import RabbitMessage, MessageEventType
1515
from rabbit_consumer.vm_data import VmData

OpenStack-Rabbit-Consumer/test/fixtures.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import pytest
44

5-
from rabbit_consumer.build_metadata import AqMetadata
5+
from rabbit_consumer.aq_metadata import AqMetadata
66
from rabbit_consumer.openstack_address import OpenstackAddress
77
from rabbit_consumer.rabbit_message import RabbitMessage, RabbitMeta, RabbitPayload
88
from rabbit_consumer.vm_data import VmData
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
from typing import Dict
2+
3+
import pytest
4+
5+
from rabbit_consumer.aq_metadata import AqMetadata
6+
7+
8+
@pytest.fixture(name="image_metadata")
9+
def fixture_image_metadata() -> Dict[str, str]:
10+
"""
11+
Creates a dictionary with mock data
12+
which represents an example OpenStack image's metadata
13+
"""
14+
return {
15+
"AQ_ARCHETYPE": "archetype_mock",
16+
"AQ_DOMAIN": "domain_mock",
17+
"AQ_PERSONALITY": "personality_mock",
18+
"AQ_OS": "os_mock",
19+
"AQ_OSVERSION": "osversion_mock",
20+
}
21+
22+
23+
def test_aq_metadata_from_initial_dict(image_metadata):
24+
"""
25+
Tests creating an AQ metadata object from an initial dictionary
26+
"""
27+
returned = AqMetadata.from_dict(image_metadata)
28+
29+
assert returned.aq_archetype == "archetype_mock"
30+
assert returned.aq_domain == "domain_mock"
31+
assert returned.aq_personality == "personality_mock"
32+
assert returned.aq_os == "os_mock"
33+
assert returned.aq_os_version == "osversion_mock"
34+
35+
36+
def test_aq_metadata_override_all(image_metadata):
37+
"""
38+
Tests overriding all values in an AQ metadata object
39+
"""
40+
returned = AqMetadata.from_dict(image_metadata)
41+
returned.override_from_vm_meta(
42+
{
43+
"AQ_ARCHETYPE": "archetype_mock_override",
44+
"AQ_DOMAIN": "domain_mock_override",
45+
"AQ_PERSONALITY": "personality_mock_override",
46+
}
47+
)
48+
49+
assert returned.aq_archetype == "archetype_mock_override"
50+
assert returned.aq_domain == "domain_mock_override"
51+
assert returned.aq_personality == "personality_mock_override"
52+
53+
# Check the original values are still there
54+
assert returned.aq_os == "os_mock"
55+
assert returned.aq_os_version == "osversion_mock"
56+
57+
58+
def test_aq_metadata_override_sandbox(image_metadata):
59+
"""
60+
Tests overriding the sandbox value in an AQ metadata object
61+
maps correctly onto the domain value
62+
"""
63+
returned = AqMetadata.from_dict(image_metadata)
64+
returned.override_from_vm_meta(
65+
{
66+
"AQ_SANDBOX": "sandbox_mock",
67+
}
68+
)
69+
# This should be the only value that has changed
70+
assert returned.aq_domain == "sandbox_mock"
71+
72+
assert returned.aq_archetype == "archetype_mock"
73+
assert returned.aq_personality == "personality_mock"
74+
assert returned.aq_os == "os_mock"
75+
assert returned.aq_os_version == "osversion_mock"

0 commit comments

Comments
 (0)