Skip to content

Commit 0c51074

Browse files
authored
Merge pull request #119 from phj-loopy/master
feat: add Functions and Container Registries inventory collection
2 parents 85b19bc + b321478 commit 0c51074

File tree

19 files changed

+1151
-3
lines changed

19 files changed

+1151
-3
lines changed

pkg/pip_requirements.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ azure-mgmt-containerinstance
1616
azure-mgmt-webpubsub
1717
azure-mgmt-resource
1818
azure-mgmt-advisor==10.0.0b1
19-
azure-mgmt-cognitiveservices
19+
azure-mgmt-cognitiveservices
20+
21+
azure-mgmt-containerregistry

src/plugin/connector/base.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from azure.mgmt.cognitiveservices import CognitiveServicesManagementClient
99
from azure.mgmt.compute import ComputeManagementClient
1010
from azure.mgmt.containerinstance import ContainerInstanceManagementClient
11+
# Container Registry 클라이언트 import 추가
12+
from azure.mgmt.containerregistry import ContainerRegistryManagementClient
1113
from azure.mgmt.cosmosdb import CosmosDBManagementClient
1214
from azure.mgmt.keyvault import KeyVaultManagementClient
1315
from azure.mgmt.monitor import MonitorManagementClient
@@ -41,6 +43,7 @@ def __init__(self, *args, **kwargs):
4143
self.sql_client = None
4244
self.monitor_client = None
4345
self.container_instance_client = None
46+
self.container_registry_client = None
4447
self.resource_client = None
4548
self.resource_health_client = None
4649
self.storage_client = None
@@ -81,6 +84,10 @@ def set_connect(self, secret_data: dict):
8184
self.container_instance_client = ContainerInstanceManagementClient(
8285
credential=self.credential, subscription_id=subscription_id
8386
)
87+
self.container_registry_client = ContainerRegistryManagementClient(
88+
credential=self.credential, subscription_id=subscription_id
89+
)
90+
8491
self.resource_client = ResourceManagementClient(
8592
credential=self.credential, subscription_id=subscription_id
8693
)

src/plugin/connector/container_registries/__init__.py

Whitespace-only changes.
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import logging
2+
3+
from plugin.connector.base import AzureBaseConnector
4+
5+
_LOGGER = logging.getLogger("spaceone")
6+
7+
8+
class ContainerRegistriesConnector(AzureBaseConnector):
9+
def __init__(self, **kwargs):
10+
super().__init__(**kwargs)
11+
self.set_connect(kwargs.get("secret_data"))
12+
13+
def list_registries(self):
14+
return self.container_registry_client.registries.list()
15+
16+
def get_registry(self, resource_group_name, registry_name):
17+
return self.container_registry_client.registries.get(
18+
resource_group_name=resource_group_name, registry_name=registry_name
19+
)
20+
21+
def list_webhooks(self, resource_group_name, registry_name):
22+
try:
23+
return self.container_registry_client.webhooks.list(
24+
resource_group_name=resource_group_name, registry_name=registry_name
25+
)
26+
except Exception as e:
27+
_LOGGER.error(f"[list_webhooks] Error: {e}")
28+
return []
29+
30+
def list_replications(self, resource_group_name, registry_name):
31+
try:
32+
return self.container_registry_client.replications.list(
33+
resource_group_name=resource_group_name, registry_name=registry_name
34+
)
35+
except Exception as e:
36+
_LOGGER.error(f"[list_replications] Error: {e}")
37+
return []
38+
39+
def list_usages(self, resource_group_name, registry_name):
40+
try:
41+
return self.container_registry_client.registries.list_usages(
42+
resource_group_name=resource_group_name, registry_name=registry_name
43+
)
44+
except Exception as e:
45+
_LOGGER.error(f"[list_usages] Error: {e}")
46+
return None
47+
48+
def list_tokens(self, resource_group_name, registry_name):
49+
try:
50+
tokens_ops = getattr(self.container_registry_client, "tokens", None)
51+
if tokens_ops:
52+
return tokens_ops.list(
53+
resource_group_name=resource_group_name, registry_name=registry_name
54+
)
55+
except Exception as e:
56+
_LOGGER.error(f"[list_tokens] Error: {e}")
57+
return []
58+
59+
def list_scope_maps(self, resource_group_name, registry_name):
60+
try:
61+
scope_maps_ops = getattr(self.container_registry_client, "scope_maps", None)
62+
if scope_maps_ops:
63+
return scope_maps_ops.list(
64+
resource_group_name=resource_group_name, registry_name=registry_name
65+
)
66+
except Exception as e:
67+
_LOGGER.error(f"[list_scope_maps] Error: {e}")
68+
return []
69+
70+
def list_cache_rules(self, resource_group_name, registry_name):
71+
try:
72+
cache_rules_ops = getattr(
73+
self.container_registry_client, "cache_rules", None
74+
)
75+
if cache_rules_ops:
76+
return cache_rules_ops.list(
77+
resource_group_name=resource_group_name, registry_name=registry_name
78+
)
79+
except Exception as e:
80+
_LOGGER.error(f"[list_cache_rules] Error: {e}")
81+
return []
82+
83+
def list_connected_registries(self, resource_group_name, registry_name):
84+
try:
85+
connected_ops = getattr(
86+
self.container_registry_client, "connected_registries", None
87+
)
88+
if connected_ops:
89+
return connected_ops.list(
90+
resource_group_name=resource_group_name, registry_name=registry_name
91+
)
92+
except Exception as e:
93+
_LOGGER.error(f"[list_connected_registries] Error: {e}")
94+
return []
95+
96+
def list_tasks(self, resource_group_name, registry_name):
97+
try:
98+
tasks_ops = getattr(self.container_registry_client, "tasks", None)
99+
if tasks_ops:
100+
return tasks_ops.list(
101+
resource_group_name=resource_group_name, registry_name=registry_name
102+
)
103+
except Exception as e:
104+
_LOGGER.error(f"[list_tasks] Error: {e}")
105+
return []

src/plugin/connector/functions/__init__.py

Whitespace-only changes.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import logging
2+
from plugin.connector.base import AzureBaseConnector
3+
4+
_LOGGER = logging.getLogger("spaceone")
5+
6+
MANAGEMENT_BASE_URL = "https://management.azure.com"
7+
WEB_API_VERSION = "2025-03-01"
8+
9+
10+
class FunctionsConnector(AzureBaseConnector):
11+
def __init__(self, **kwargs):
12+
super().__init__(**kwargs)
13+
secret_data = kwargs.get("secret_data", {})
14+
self.set_connect(secret_data)
15+
self.subscription_id = secret_data.get("subscription_id")
16+
17+
def list_function_apps(self):
18+
function_apps = []
19+
20+
for res in self.resource_client.resources.list():
21+
if res.type == "Microsoft.Web/sites":
22+
kind = (getattr(res, "kind", "") or "").lower()
23+
if "functionapp" in kind:
24+
function_apps.append(res)
25+
26+
_LOGGER.debug(f"[FunctionsConnector] Found {len(function_apps)} function apps")
27+
return function_apps
28+
29+
def get_function_app_detail(self, resource_id: str) -> dict:
30+
if not resource_id:
31+
return {}
32+
33+
url = f"{MANAGEMENT_BASE_URL}{resource_id}?api-version={WEB_API_VERSION}"
34+
return self.request_azure_api(url, method="GET") or {}
35+
36+
def get_app_service_plan_detail(self, server_farm_id: str) -> dict:
37+
if not server_farm_id:
38+
return {}
39+
40+
url = f"{MANAGEMENT_BASE_URL}{server_farm_id}?api-version={WEB_API_VERSION}"
41+
return self.request_azure_api(url, method="GET") or {}

src/plugin/main.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
# "inventory.Region",
2020
]
2121

22-
2322
@app.route("Collector.init")
2423
def collector_init(params: dict) -> dict:
2524
return _create_init_metadata()

src/plugin/manager/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from .application_gatways import *
33
from .cognitive_services import *
44
from .container_instances import *
5+
from .container_registries import *
56
from .cosmos_db import *
67
from .disks import *
78
from .key_vaults import *
@@ -23,3 +24,4 @@
2324
from .virtual_networks import *
2425
from .vm_scale_sets import *
2526
from .web_pub_sub_service import *
27+
from .functions import *
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
from .instance_manager import CognitiveServicesManager
1+
from .instance_manager import CognitiveServicesManager
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .registry_manager import ContainerRegistriesManager

0 commit comments

Comments
 (0)