File: core.py

package info (click to toggle)
python-moto 5.1.18-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 116,520 kB
  • sloc: python: 636,725; javascript: 181; makefile: 39; sh: 3
file content (58 lines) | stat: -rw-r--r-- 1,955 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
from typing import Any, Optional

from moto.core.common_models import BaseModel

from ..exceptions import FilterNotImplementedError


class TaggedEC2Resource(BaseModel):
    def get_tags(self) -> list[dict[str, str]]:
        tags = []
        if self.id:  # type: ignore[attr-defined]
            tags = self.ec2_backend.describe_tags(filters={"resource-id": [self.id]})  # type: ignore[attr-defined]
        return tags

    @property
    def tag_list(self) -> list[dict[str, str]]:
        return self.tag_set

    @property
    def tag_set(self) -> list[dict[str, str]]:
        return self.get_tags()

    def add_tag(self, key: str, value: str) -> None:
        self.ec2_backend.create_tags([self.id], {key: value})  # type: ignore[attr-defined]

    def add_tags(self, tag_map: dict[str, str]) -> None:
        for key, value in tag_map.items():
            self.ec2_backend.create_tags([self.id], {key: value})  # type: ignore[attr-defined]

    def get_filter_value(
        self, filter_name: str, method_name: Optional[str] = None
    ) -> Any:
        tags = self.get_tags()

        if filter_name.startswith("tag:"):
            tagname = filter_name.replace("tag:", "", 1)
            for tag in tags:
                if tag["key"] == tagname:
                    return tag["value"]

            return None
        elif filter_name == "tag-key":
            return [tag["key"] for tag in tags]
        elif filter_name == "tag-value":
            return [tag["value"] for tag in tags]

        value = getattr(self, filter_name.lower().replace("-", "_"), None)
        if value is not None:
            return value

        raise FilterNotImplementedError(filter_name, method_name)

    def match_tags(self, filters: dict[str, str]) -> bool:
        for tag_name in filters.keys():
            tag_value = self.get_filter_value(tag_name)
            if tag_value == filters[tag_name][0]:
                return True
        return False