diff --git a/pkg/pip_requirements.txt b/pkg/pip_requirements.txt
index 7995e09c..67960dd9 100644
--- a/pkg/pip_requirements.txt
+++ b/pkg/pip_requirements.txt
@@ -17,4 +17,5 @@ azure-mgmt-keyvault
azure-keyvault-certificates
azure-keyvault-secrets
azure-mgmt-rdbms
-azure-mgmt-cosmosdb
\ No newline at end of file
+azure-mgmt-cosmosdb
+azure-mgmt-containerinstance
\ No newline at end of file
diff --git a/src/spaceone/inventory/conf/cloud_service_conf.py b/src/spaceone/inventory/conf/cloud_service_conf.py
index edfb3fed..f8e3a8b1 100644
--- a/src/spaceone/inventory/conf/cloud_service_conf.py
+++ b/src/spaceone/inventory/conf/cloud_service_conf.py
@@ -7,6 +7,7 @@
CLOUD_SERVICE_GROUP_MAP = {
'ApplicationGateways': 'ApplicationGatewaysManager',
+ 'ContainerInstances': 'ContainerInstancesManager',
'CosmosDB': 'CosmosDBManager',
'Disks': 'DisksManager',
'KeyVaults': 'KeyVaultsManager',
@@ -20,7 +21,8 @@
'PublicIPAddresses': 'PublicIPAddressesManager',
'Snapshots': 'SnapshotsManager',
'StorageAccounts': 'StorageAccountsManager',
+ 'VirtualMachines': 'VirtualMachinesManager',
'VirtualNetworks': 'VirtualNetworksManager',
'VMScaleSets': 'VmScaleSetsManager',
- 'VirtualMachines': 'VirtualMachinesManager',
+
}
diff --git a/src/spaceone/inventory/connector/__init__.py b/src/spaceone/inventory/connector/__init__.py
index 800e6de6..59ca4f92 100644
--- a/src/spaceone/inventory/connector/__init__.py
+++ b/src/spaceone/inventory/connector/__init__.py
@@ -17,3 +17,4 @@
from spaceone.inventory.connector.virtual_machines import VirtualMachinesConnector
from spaceone.inventory.connector.sql_servers import SQLServersConnector
from spaceone.inventory.connector.sql_databases import SQLDatabasesConnector
+from spaceone.inventory.connector.container_instances import ContainerInstancesConnector
diff --git a/src/spaceone/inventory/connector/container_instances/__init__.py b/src/spaceone/inventory/connector/container_instances/__init__.py
new file mode 100644
index 00000000..365e445f
--- /dev/null
+++ b/src/spaceone/inventory/connector/container_instances/__init__.py
@@ -0,0 +1 @@
+from spaceone.inventory.connector.container_instances.connector import ContainerInstancesConnector
\ No newline at end of file
diff --git a/src/spaceone/inventory/connector/container_instances/connector.py b/src/spaceone/inventory/connector/container_instances/connector.py
new file mode 100644
index 00000000..eec76bd0
--- /dev/null
+++ b/src/spaceone/inventory/connector/container_instances/connector.py
@@ -0,0 +1,20 @@
+import logging
+
+from spaceone.inventory.libs.connector import AzureConnector
+from spaceone.inventory.error.custom import *
+__all__ = ['ContainerInstancesConnector']
+_LOGGER = logging.getLogger(__name__)
+
+
+class ContainerInstancesConnector(AzureConnector):
+
+ def __init__(self, **kwargs):
+ super().__init__(**kwargs)
+ self.set_connect(kwargs.get('secret_data'))
+
+ def list_container_groups(self):
+ return self.container_instance_client.container_groups.list()
+
+ def get_container_groups(self, resource_group_name, container_group_name):
+ return self.container_instance_client.container_groups.get(resource_group_name=resource_group_name,
+ container_group_name=container_group_name)
diff --git a/src/spaceone/inventory/libs/connector.py b/src/spaceone/inventory/libs/connector.py
index 43983895..51092e80 100644
--- a/src/spaceone/inventory/libs/connector.py
+++ b/src/spaceone/inventory/libs/connector.py
@@ -13,6 +13,7 @@
from azure.mgmt.rdbms.mysql import MySQLManagementClient
from azure.mgmt.cosmosdb import CosmosDBManagementClient
from azure.mgmt.rdbms.postgresql import PostgreSQLManagementClient
+from azure.mgmt.containerinstance import ContainerInstanceManagementClient
from spaceone.core.connector import BaseConnector
DEFAULT_SCHEMA = 'azure_client_secret'
@@ -48,6 +49,7 @@ def __init__(self, **kwargs):
self.mysql_client = None
self.cosmosdb_client = None
self.postgre_sql_client = None
+ self.container_instance_client = None
def set_connect(self, secret_data):
subscription_id = secret_data['subscription_id']
@@ -70,6 +72,7 @@ def set_connect(self, secret_data):
self.mysql_client = MySQLManagementClient(credential=credential, subscription_id=subscription_id)
self.cosmosdb_client = CosmosDBManagementClient(credential=credential, subscription_id=subscription_id)
self.postgre_sql_client = PostgreSQLManagementClient(credential=credential, subscription_id=subscription_id)
+ self.container_instance_client = ContainerInstanceManagementClient(credential=credential, subscription_id=subscription_id)
def verify(self, **kwargs):
self.set_connect(kwargs['secret_data'])
diff --git a/src/spaceone/inventory/libs/schema/resource.py b/src/spaceone/inventory/libs/schema/resource.py
index 6538e23c..8255b950 100644
--- a/src/spaceone/inventory/libs/schema/resource.py
+++ b/src/spaceone/inventory/libs/schema/resource.py
@@ -62,5 +62,4 @@ class AzureCloudService(Model):
resource_group = StringType(serialize_when_none=False)
subscription_id = StringType(serialize_when_none=False)
subscription_name = StringType(serialize_when_none=False)
- tags = ListType(ModelType(AzureTags), default=[])
azure_monitor = ModelType(AzureMonitorModel, serialize_when_none=False)
\ No newline at end of file
diff --git a/src/spaceone/inventory/manager/__init__.py b/src/spaceone/inventory/manager/__init__.py
index 5fae02a8..0975bfd0 100644
--- a/src/spaceone/inventory/manager/__init__.py
+++ b/src/spaceone/inventory/manager/__init__.py
@@ -16,3 +16,4 @@
from spaceone.inventory.manager.cosmos_db.instance_manager import CosmosDBManager
from spaceone.inventory.manager.postgresql_servers.server_manager import PostgreSQLServersManager
from spaceone.inventory.manager.virtual_machines.instnace_manger import VirtualMachinesManager
+from spaceone.inventory.manager.container_instances.container_manager import ContainerInstancesManager
diff --git a/src/spaceone/inventory/manager/container_instances/__init__.py b/src/spaceone/inventory/manager/container_instances/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/spaceone/inventory/manager/container_instances/container_manager.py b/src/spaceone/inventory/manager/container_instances/container_manager.py
new file mode 100644
index 00000000..3f49ca07
--- /dev/null
+++ b/src/spaceone/inventory/manager/container_instances/container_manager.py
@@ -0,0 +1,86 @@
+import time
+import logging
+from spaceone.inventory.libs.manager import AzureManager
+from spaceone.inventory.connector.container_instances import ContainerInstancesConnector
+from spaceone.inventory.model.container_instances.cloud_service import *
+from spaceone.inventory.model.container_instances.cloud_service_type import CLOUD_SERVICE_TYPES
+from spaceone.inventory.model.container_instances.data import *
+
+_LOGGER = logging.getLogger(__name__)
+
+
+class ContainerInstancesManager(AzureManager):
+ connector_name = 'ContainerInstancesConnector'
+ cloud_service_types = CLOUD_SERVICE_TYPES
+
+ def collect_cloud_service(self, params):
+ """
+ Args:
+ params (dict):
+ - 'options' : 'dict'
+ - 'schema' : 'str'
+ - 'secret_data' : 'dict'
+ - 'filter' : 'dict'
+ - 'zones' : 'list'
+ - 'subscription_info' : 'dict'
+ Response:
+ CloudServiceResponse (list) : list of azure application gateway data resource information
+ ErrorResourceResponse (list) : list of error resource information
+ """
+
+ _LOGGER.debug(f'** Container Instances START **')
+
+ start_time = time.time()
+ subscription_info = params['subscription_info']
+
+ container_instances_conn: ContainerInstancesConnector = self.locator.get_connector(self.connector_name, **params)
+ container_instances_responses = []
+ error_responses = []
+
+ container_instances = container_instances_conn.list_container_groups()
+ for container_instance in container_instances:
+ container_instance_id = ''
+ try:
+ container_instance_dict = self.convert_nested_dictionary(container_instance)
+ container_instance_id = container_instance_dict['id']
+
+ # if bug fix these code will be deleted
+ resource_group_name = self.get_resource_group_from_id(container_instance_id)
+ container_group_name = container_instance_dict['name']
+ container_instance = container_instances_conn.get_container_groups(resource_group_name=resource_group_name,
+ container_group_name=container_group_name)
+ container_instance_dict = self.convert_nested_dictionary(container_instance)
+ time.sleep(0.2) # end code
+
+ # Update data info in Container's Raw Data
+ container_instance_dict.update({
+ 'resource_group': self.get_resource_group_from_id(container_instance_id),
+ 'subscription_id': subscription_info['subscription_id'],
+ 'subscription_name': subscription_info['subscription_name'],
+ 'azure_monitor': {'resource_id': container_instance_id},
+ 'container_count_display': container_instance_dict['containers'].__len__()
+ })
+
+ # switch tags form and update tag info
+ _tags = self.convert_tag_format(container_instance_dict.get('tags', {}))
+
+ container_instance_data = ContainerInstance(container_instance_dict, strict=False)
+ container_instance_resource = ContainerInstanceResource({
+ 'name': container_instance_data.name,
+ 'account': container_instance_dict['subscription_id'],
+ 'state': container_instance_data.instance_view.state,
+ 'data': container_instance_data,
+ 'tags': _tags,
+ 'region_code': container_instance_data.location
+ })
+
+ self.set_region_code(container_instance_data['location'])
+ container_instances_responses.append(ContainerInstanceResponse({'resource': container_instance_resource}))
+
+ except Exception as e:
+ _LOGGER.error(f'[list_instances] {container_instance_id} {e}', exc_info=True)
+ error_response = self.generate_resource_error_response(e, 'Container', 'ContainerInstances', container_instance_id)
+ error_responses.append(error_response)
+
+ _LOGGER.debug(f'** Container Instances Finished {time.time() - start_time} Seconds **')
+ return container_instances_responses, error_responses
diff --git a/src/spaceone/inventory/manager/sql_databases/database_manager.py b/src/spaceone/inventory/manager/sql_databases/database_manager.py
index 2cf317dc..1b55b26e 100644
--- a/src/spaceone/inventory/manager/sql_databases/database_manager.py
+++ b/src/spaceone/inventory/manager/sql_databases/database_manager.py
@@ -233,10 +233,10 @@ def get_database_auditing_settings(self, sql_databases_conn, resource_group_name
@staticmethod
def get_pricing_tier_display(sku_dict):
- pricing_tier = None
- if sku_dict.get('capacity') is not None:
+ if sku_dict['name'] in ['Basic', 'Standard', 'Premium']:
+ pricing_tier = f'{sku_dict["tier"]}: {sku_dict["capacity"]} DTU'
+ else:
pricing_tier = f'{str(sku_dict["tier"])} : {str(sku_dict["family"])} , {str(sku_dict["capacity"])} vCores'
-
return pricing_tier
@staticmethod
diff --git a/src/spaceone/inventory/model/container_instances/__init__.py b/src/spaceone/inventory/model/container_instances/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/spaceone/inventory/model/container_instances/cloud_service.py b/src/spaceone/inventory/model/container_instances/cloud_service.py
new file mode 100644
index 00000000..3ff2d1e2
--- /dev/null
+++ b/src/spaceone/inventory/model/container_instances/cloud_service.py
@@ -0,0 +1,79 @@
+from schematics.types import ModelType, StringType, PolyModelType, FloatType, DateTimeType
+from spaceone.inventory.model.container_instances.data import ContainerInstance
+from spaceone.inventory.libs.schema.cloud_service import CloudServiceResource, CloudServiceResponse, CloudServiceMeta
+from spaceone.inventory.libs.schema.metadata.dynamic_layout import ItemDynamicLayout, TableDynamicLayout, ListDynamicLayout
+from spaceone.inventory.libs.schema.metadata.dynamic_field import TextDyField, DateTimeDyField, EnumDyField, ListDyField, SizeField
+
+'''
+CONTAINER_INSTANCES
+'''
+
+# TAB - Default
+container_instances_info_meta = ItemDynamicLayout.set_fields('Container Instances', fields=[
+ TextDyField.data_source('Name', 'name'),
+ TextDyField.data_source('Resource ID', 'data.id'),
+ TextDyField.data_source('Resource Group', 'data.resource_group'),
+ TextDyField.data_source('Region', 'region_code'),
+ TextDyField.data_source('Subscription', 'data.subscription_name'),
+ TextDyField.data_source('Subscription ID', 'account'),
+ TextDyField.data_source('SKU', 'data.sku'),
+ TextDyField.data_source('OS type', 'data'),
+ TextDyField.data_source('Container count', 'data.container_count_display'),
+ TextDyField.data_source('IP Address', 'data.ip_address.ip'),
+ TextDyField.data_source('IP Address Type', 'data.ip_address.type'),
+ TextDyField.data_source('FQDN', 'data.ip_address.fqdn'),
+ TextDyField.data_source('DNS name label', 'data.ip_address.auto_generated_domain_name_label_scope'),
+ TextDyField.data_source('DNS name label scope reuse', 'data.ip_address.dns_name_label'),
+ ListDyField.data_source('Ports', 'data.ip_address.ports.port', options={'delimiter': '
'})
+])
+
+# TAB -Container
+container_instances_info_container = TableDynamicLayout.set_fields('Containers', 'data', fields=[
+ TextDyField.data_source('Name', 'containers.name'),
+ TextDyField.data_source('Container Instance', 'name'),
+ TextDyField.data_source('Image', 'containers.image'),
+ TextDyField.data_source('State', 'containers.instance_view.current_state.state'),
+ TextDyField.data_source('Start time', 'containers.instance_view.current_state.start_time'),
+ TextDyField.data_source('Restart count', 'containers.instance_view.restart_count'),
+ TextDyField.data_source('CPU cores', 'containers.resources.requests.cpu', options={
+ 'translation_id': 'PAGE_SCHEMA.CPU_CORE',
+ }),
+ TextDyField.data_source('Memory', 'containers.resources.requests.memory_in_gb', options={
+ 'translation_id': 'PAGE_SCHEMA.MEMORY',
+ }),
+ TextDyField.data_source('GPU SKU', 'containers.resources.requests.gpu.sku'),
+ TextDyField.data_source('GPU count', 'containers.resources.requests.gpu.count'),
+ ListDyField.data_source('Commands', 'containers.command', options={'delimiter': '
'}),
+])
+
+# TAB - Volume
+container_instances_info_volumes = TableDynamicLayout.set_fields('Volumes', 'data', fields=[
+ TextDyField.data_source('Name', 'volumes.name'),
+ TextDyField.data_source('Container Instance', 'name'),
+ TextDyField.data_source('Volume type', 'containers.volume_mounts.name'),
+ TextDyField.data_source('Mount path', 'containers.volume_mounts.mount_path')
+
+])
+
+container_instances_meta = CloudServiceMeta.set_layouts(
+ [container_instances_info_meta, container_instances_info_container, container_instances_info_volumes]
+)
+
+
+class ContainerResource(CloudServiceResource):
+ cloud_service_group = StringType(default='ContainerInstances')
+
+
+class ContainerInstanceResource(ContainerResource):
+ cloud_service_type = StringType(default='Container')
+ data = ModelType(ContainerInstance)
+ _metadata = ModelType(CloudServiceMeta, default=container_instances_meta, serialized_name='metadata')
+ name = StringType(serialize_when_none=False)
+ account = StringType(serialize_when_none=False)
+ instance_type = StringType(serialize_when_none=False)
+ instance_size = FloatType(serialize_when_none=False)
+ state = StringType(serialize_when_none=False)
+
+
+class ContainerInstanceResponse(CloudServiceResponse):
+ resource = PolyModelType(ContainerInstanceResource)
diff --git a/src/spaceone/inventory/model/container_instances/cloud_service_type.py b/src/spaceone/inventory/model/container_instances/cloud_service_type.py
new file mode 100644
index 00000000..b57e81e5
--- /dev/null
+++ b/src/spaceone/inventory/model/container_instances/cloud_service_type.py
@@ -0,0 +1,83 @@
+import os
+from spaceone.inventory.libs.utils import *
+from spaceone.inventory.libs.schema.metadata.dynamic_widget import CardWidget, ChartWidget
+from spaceone.inventory.libs.schema.metadata.dynamic_field import TextDyField, SearchField
+from spaceone.inventory.libs.schema.cloud_service_type import CloudServiceTypeResource, CloudServiceTypeResponse, \
+ CloudServiceTypeMeta
+
+current_dir = os.path.abspath(os.path.dirname(__file__))
+
+container_instances_count_by_account_conf = os.path.join(current_dir, 'widget/container_instances_count_by_account.yaml')
+container_instances_count_by_region_conf = os.path.join(current_dir, 'widget/container_instances_count_by_region.yaml')
+container_instances_count_by_subscription_conf = os.path.join(current_dir, 'widget/container_Instances_count_by_subscription.yaml')
+container_instances_total_container_conf = os.path.join(current_dir, 'widget/container_instances_total_container_count.yaml')
+container_instances_total_count_conf = os.path.join(current_dir, 'widget/container_instances_total_count.yaml')
+container_instances_total_gpu_conf = os.path.join(current_dir, 'widget/container_instances_total_gpu_count.yaml')
+container_instances_total_memory_conf = os.path.join(current_dir, 'widget/container_instances_total_memory_size.yaml')
+container_instances_total_vcpu_conf = os.path.join(current_dir, 'widget/container_instances_total_vcpu_count.yaml')
+
+cst_container_instances = CloudServiceTypeResource()
+cst_container_instances.name = 'Container'
+cst_container_instances.group = 'ContainerInstances'
+cst_container_instances.service_code = 'Microsoft.ContainerInstance/containerGroups'
+cst_container_instances.labels = ['Container']
+cst_container_instances.is_major = True
+cst_container_instances.is_primary = True
+cst_container_instances.tags = {
+ 'spaceone:icon': 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/azure/azure-container-instances.svg',
+}
+
+
+cst_container_instances._metadata = CloudServiceTypeMeta.set_meta(
+ fields=[
+ TextDyField.data_source('Container Group Name', 'name'),
+ TextDyField.data_source('Status', 'state'),
+ TextDyField.data_source('Resource Group', 'data.resource_group'),
+ TextDyField.data_source('OS type', 'data.os_type'),
+ TextDyField.data_source('Total Containers', 'data.container_count_display'),
+ TextDyField.data_source('Subscription ID', 'account'),
+ TextDyField.data_source('Subscription Name', 'data.subscription_name'),
+ TextDyField.data_source('Provisioning State', 'data.provisioning_state', options={
+ 'is_optional': True
+ }),
+ TextDyField.data_source('Restart Policy', 'data.restart_policy', options={
+ 'is_optional': True
+ }),
+ TextDyField.data_source('IP Address', 'data.ip_address.ip', options={
+ 'is_optional': True
+ }),
+ TextDyField.data_source('IP Address Type', 'data.ip_address.type', options={
+ 'is_optional': True
+ }),
+ TextDyField.data_source('FQDN', 'data.ip_address.fqdn', options={
+ 'is_optional': True
+ })
+ ],
+ search=[
+ SearchField.set(name='Container Group Name', key='name'),
+ SearchField.set(name='Status', key='state'),
+ SearchField.set(name='Resource Group', key='data.resource_group'),
+ SearchField.set(name='OS type', key='data.os_type'),
+ SearchField.set(name='Total Containers', key='data.container_count_display'),
+ SearchField.set(name='Subscription ID', key='account'),
+ SearchField.set(name='Subscription Name', key='data.subscription_name'),
+ SearchField.set(name='Provisioning State', key='data.provisioning_state'),
+ SearchField.set(name='Restart Policy', key='data.restart_policy'),
+ SearchField.set(name='IP Address', key='data.ip_address.ip'),
+ SearchField.set(name='FQDN', key='data.ip_address.fqdn'),
+ ],
+ widget=[
+ ChartWidget.set(**get_data_from_yaml(container_instances_count_by_account_conf)),
+ ChartWidget.set(**get_data_from_yaml(container_instances_count_by_region_conf)),
+ ChartWidget.set(**get_data_from_yaml(container_instances_count_by_subscription_conf)),
+ CardWidget.set(**get_data_from_yaml(container_instances_total_count_conf)),
+ CardWidget.set(**get_data_from_yaml(container_instances_total_container_conf)),
+ CardWidget.set(**get_data_from_yaml(container_instances_total_vcpu_conf)),
+ CardWidget.set(**get_data_from_yaml(container_instances_total_gpu_conf)),
+ CardWidget.set(**get_data_from_yaml(container_instances_total_gpu_conf))
+ ]
+)
+
+CLOUD_SERVICE_TYPES = [
+ CloudServiceTypeResponse({'resource': cst_container_instances}),
+]
\ No newline at end of file
diff --git a/src/spaceone/inventory/model/container_instances/data.py b/src/spaceone/inventory/model/container_instances/data.py
new file mode 100644
index 00000000..02ca342b
--- /dev/null
+++ b/src/spaceone/inventory/model/container_instances/data.py
@@ -0,0 +1,259 @@
+from schematics import Model
+from schematics.types import ModelType, DictType, StringType, ListType, IntType, BooleanType, DateTimeType, FloatType
+from spaceone.inventory.libs.schema.resource import AzureCloudService
+
+
+# ContainerGroupIdentity
+class UserAssignedIdentity(Model):
+ client_id = StringType(serialize_when_none=False)
+ principal_id = StringType(serialize_when_none=False)
+
+
+class ContainerGroupIdentity(Model):
+ principal_id = StringType(serialize_when_none=False)
+ tenant_id = StringType(serialize_when_none=False)
+ type = StringType(choices=('NONE', 'SYSTEM_ASSIGNED', 'SYSTEM_ASSIGNED_USER_ASSIGNED', 'USER_ASSIGNED'), serialize_when_none=False)
+ user_assigned_identities = DictType(StringType, ModelType(UserAssignedIdentity), serialize_when_none=False)
+
+
+# Container
+class ContainerPort(Model):
+ protocol = StringType(choices=('TCP', 'UDP'), default='TCP')
+ port = IntType(serialize_when_none=False)
+
+
+class EnvironmentVariable(Model):
+ name = StringType(serialize_when_none=False)
+ value = StringType(serialize_when_none=False)
+ secure_value = StringType(serialize_when_none=False)
+
+
+# Container - ContainerPropertiesInstanceView
+class ContainerState(Model):
+ state = StringType(serialize_when_none=False)
+ start_time = DateTimeType(serialize_when_none=False)
+ exit_code = IntType(serialize_when_none=False)
+ finish_time = DateTimeType(serialize_when_none=False)
+ detail_status = StringType(serialize_when_none=False)
+
+
+class Event(Model):
+ count = IntType(serialize_when_none=False)
+ first_timestamp = DateTimeType(serialize_when_none=False)
+ last_timestamp = DateTimeType(serialize_when_none=False)
+ name = StringType(serialize_when_none=False)
+ message = StringType(serialize_when_none=False)
+ type = StringType(serialize_when_none=False)
+
+
+class ContainerPropertiesInstanceView(Model):
+ restart_count = IntType(serialize_when_none=False)
+ current_state = ModelType(ContainerState, serialize_when_none=False)
+ previous_state = ModelType(ContainerState, serialize_when_none=False)
+ events = ListType(ModelType(Event), serialize_when_none=False)
+
+
+# Container - ResourceRequirements
+class GpuResource(Model):
+ count = IntType(serialize_when_none=False)
+ sku = StringType(choices=('K80', 'P100', 'V100'), serialize_when_none=False)
+
+
+class ResourceRequests(Model):
+ memory_in_gb = FloatType(serialize_when_none=False)
+ cpu = FloatType(serialize_when_none=False)
+ gpu = ModelType(GpuResource, serialize_when_none=False)
+
+
+class ResourceLimits(Model):
+ memory_in_gb = FloatType(serialize_when_none=False)
+ cpu = FloatType(serialize_when_none=False)
+ gpu = ModelType(GpuResource, serialize_when_none=False)
+
+
+class ResourceRequirements(Model):
+ requests = ModelType(ResourceRequests, serialize_when_none=False)
+ limits = ModelType(ResourceLimits, serialize_when_none=False)
+
+
+# Container - VolumeMount
+class VolumeMount(Model):
+ name = StringType(serialize_when_none=False)
+ mount_path = StringType(serialize_when_none=False)
+ read_only = BooleanType(serialize_when_none=False)
+
+
+# Container - ContainerProbe
+class ContainerExec(Model):
+ command = ListType(StringType(serialize_when_none=False))
+
+
+class HttpHeader(Model):
+ name = StringType(serialize_when_none=False)
+ value = StringType(serialize_when_none=False)
+
+
+class ContainerHttpGet(Model):
+ path = StringType(serialize_when_none=False)
+ port = IntType(serialize_when_none=False)
+ scheme = StringType(choices=('HTTP', 'HTTPS'), serialize_when_none=False)
+ http_headers = ListType(ModelType(HttpHeader), serialize_when_none=False)
+
+
+class ContainerProbe(Model):
+ exec_property = ModelType(ContainerExec, serialize_when_none=False)
+ http_get = ModelType(ContainerHttpGet, serialize_when_none=False)
+ initial_delay_seconds = IntType(serialize_when_none=False)
+ period_seconds = IntType(serialize_when_none=False)
+ failure_threshold = IntType(serialize_when_none=False)
+ success_threshold = IntType(serialize_when_none=False)
+ timeout_seconds = IntType(serialize_when_none=False)
+
+
+class Container(Model):
+ name = StringType(serialize_when_none=False)
+ image = StringType(serialize_when_none=False)
+ command = ListType(StringType, serialize_when_none=False)
+ ports = ListType(ModelType(ContainerPort), serialize_when_none=False)
+ environment_variables = ListType(ModelType(EnvironmentVariable), serialize_when_none=False)
+ instance_view = ModelType(ContainerPropertiesInstanceView)
+ resources = ModelType(ResourceRequirements, serialize_when_none=False)
+ volume_mounts = ListType(ModelType(VolumeMount), serialize_when_none=None)
+ liveness_probe = ModelType(ContainerProbe, serialize_when_none=False)
+ readiness_probe = ModelType(ContainerProbe, serialize_when_none=False)
+
+
+# ImageRegistryCredential
+class ImageRegistryCredential(Model):
+ server = StringType(serialize_when_none=False)
+ username = StringType(serialize_when_none=False)
+ password = StringType(serialize_when_none=False)
+ identity = StringType(serialize_when_none=False)
+ identity_url = StringType(serialize_when_none=False)
+
+
+# IpAddress
+class Port(ContainerPort):
+ pass
+
+
+class IpAddress(Model):
+ ports = ListType(ModelType(Port), serialize_when_none=False)
+ type = StringType(choices=('PRIVATE', 'PUBLIC'))
+ ip = StringType(serialize_when_none=False)
+ dns_name_label = StringType(serialize_when_none=False)
+ auto_generated_domain_name_label_scope = StringType(choices=('NOREUSE', 'RESOURCE_GROUP_REUSE', 'SUBSCRIPTION_REUSE',
+ 'TENANT_REUSE', 'UNSECURE'))
+ fqdn = StringType(serialize_when_none=False)
+
+
+# Volume
+
+# Volume - AzureFileVolume
+class AzureFileVolume(Model):
+ share_name = StringType(serialize_when_none=False)
+ read_only = BooleanType(serialize_when_none=False)
+ storage_account_name = StringType(serialize_when_none=False)
+ storage_account_key = StringType(serialize_when_none=False)
+
+
+# Volume - GitRepoVolume
+class GitRepoVolume(Model):
+ directory = StringType(serialize_when_none=False)
+ repository = StringType(serialize_when_none=False)
+ revision = StringType(serialize_when_none=False)
+
+
+class Volume(Model):
+ name = StringType(serialize_when_none=False)
+ azure_file = ModelType(AzureFileVolume, serialize_when_none=False)
+ empty_dir = DictType(StringType, StringType)
+ secret = DictType(StringType, StringType, serialize_when_none=False)
+ git_repo = ModelType(GitRepoVolume, serialize_when_none=False)
+
+
+# ContainerGroupPropertiesInstanceView
+class ContainerGroupPropertiesInstanceView(Model):
+ events = ListType(ModelType(Event))
+ state = StringType(serialize_when_none=False)
+
+# ContainerGroupDiagnostics
+
+
+# ContainerGroupDiagnostics LogAnalytics
+class LogAnalytics(Model):
+ workspace_id = StringType(serialize_when_none=False)
+ workspace_key = StringType(serialize_when_none=False)
+ log_type = StringType(choices=('CONTAINER_INSIGHTS', 'CONTAINER_INSTANCE_LOGS'))
+ metadata = DictType(StringType, StringType, serialize_when_none=False)
+ workspace_resource_id = StringType(serialize_when_none=False)
+
+
+class ContainerGroupDiagnostics(Model):
+ log_analytics = ModelType(LogAnalytics, serialize_when_none=False)
+
+
+# ContainerGroupSubnetId
+class ContainerGroupSubnetId(Model):
+ id = StringType(serialize_when_none=False)
+ name = StringType(serialize_when_none=False)
+
+
+# DnsConfiguration
+class DnsConfiguration(Model):
+ name_servers = ListType(StringType, serialize_when_none=False)
+ search_domains = StringType(serialize_when_none=False)
+ options = StringType(serialize_when_none=False)
+
+
+# EncryptionProperties
+class EncryptionProperties(Model):
+ vault_base_url = StringType(serialize_when_none=False)
+ key_name = StringType(serialize_when_none=False)
+ key_version = StringType(serialize_when_none=False)
+
+# InitContainerDefinition
+
+
+# InitContainerDefinition - InitContainerPropertiesDefinitionInstanceView
+class InitContainerPropertiesDefinitionInstanceView(ContainerPropertiesInstanceView):
+ pass
+
+
+class InitContainerDefinition(Model):
+ name = StringType(serialize_when_none=False)
+ image = StringType(serialize_when_none=False)
+ command = ListType(StringType, serialize_when_none=False)
+ environment_variables = ListType(ModelType(EnvironmentVariable), serialize_when_none=False)
+ instance_view = ModelType(InitContainerPropertiesDefinitionInstanceView, serialize_when_none=False)
+ volume_mounts = ListType(ModelType(VolumeMount), serialize_when_none=False)
+
+
+class ContainerInstance(AzureCloudService): # Main Class
+ id = StringType(serialize_when_none=False)
+ location = StringType(serialize_when_none=False)
+ identity = ModelType(ContainerGroupIdentity)
+ provisioning_state = StringType(serialize_when_none=False)
+ containers = ListType(ModelType(Container), serialize_when_none=False)
+ image_registry_credentials = ListType(ModelType(ImageRegistryCredential), serialize_when_none=False)
+ restart_policy = StringType(choices=('ALWAYS', 'NEVER', 'ON_FAILURE'))
+ ip_address = ModelType(IpAddress, serialize_when_none=False)
+ os_type = StringType(choices=('LINUX', 'WINDOWS'))
+ volumes = ListType(ModelType(Volume), serialize_when_none=False)
+ instance_view = ModelType(ContainerGroupPropertiesInstanceView, serialize_when_none=False)
+ diagnostics = ModelType(ContainerGroupDiagnostics, serialize_when_none=False)
+ subnet_ids = ListType(ModelType(ContainerGroupSubnetId), serialize_when_none=False)
+ dns_config = ModelType(DnsConfiguration, serialize_when_none=False)
+ sku = StringType(choices=('DEDICATED', 'STANDARD'), serialize_when_none=False)
+ encryption_properties = ModelType(EncryptionProperties, serialize_when_none=False)
+ init_containers = ListType(ModelType(InitContainerDefinition), serialize_when_none=False)
+ name = StringType(serialize_when_none=False)
+ type = StringType(serialize_when_none=False)
+ zones = ListType(StringType, serialize_when_none=False)
+ container_count_display = IntType(serialize_when_none=False)
+
+ def reference(self):
+ return {
+ "resource_id": self.id,
+ "external_link": f"https://portal.azure.com/#@.onmicrosoft.com/resource{self.id}/overview",
+ }
\ No newline at end of file
diff --git a/src/spaceone/inventory/model/container_instances/widget/container_Instances_count_by_subscription.yaml b/src/spaceone/inventory/model/container_instances/widget/container_Instances_count_by_subscription.yaml
new file mode 100644
index 00000000..9b7cd263
--- /dev/null
+++ b/src/spaceone/inventory/model/container_instances/widget/container_Instances_count_by_subscription.yaml
@@ -0,0 +1,16 @@
+---
+cloud_service_group: ContainerInstances
+cloud_service_type: Container
+name: Count by Subscription
+query:
+ aggregate:
+ - group:
+ keys:
+ - name: name
+ key: account
+ fields:
+ - name: value
+ key: account
+ operator: count
+options:
+ chart_type: DONUT
diff --git a/src/spaceone/inventory/model/container_instances/widget/container_instances_count_by_account.yaml b/src/spaceone/inventory/model/container_instances/widget/container_instances_count_by_account.yaml
new file mode 100644
index 00000000..a865425e
--- /dev/null
+++ b/src/spaceone/inventory/model/container_instances/widget/container_instances_count_by_account.yaml
@@ -0,0 +1,19 @@
+---
+cloud_service_group: ContainerInstances
+cloud_service_type: Container
+name: Count By Account
+query:
+ aggregate:
+ - group:
+ keys:
+ - name: name
+ key: account
+ fields:
+ - name: value
+ operator: count
+ filter:
+ - key: account
+ value: true
+ operator: exists
+options:
+ chart_type: DONUT
diff --git a/src/spaceone/inventory/model/container_instances/widget/container_instances_count_by_region.yaml b/src/spaceone/inventory/model/container_instances/widget/container_instances_count_by_region.yaml
new file mode 100644
index 00000000..efef2e2c
--- /dev/null
+++ b/src/spaceone/inventory/model/container_instances/widget/container_instances_count_by_region.yaml
@@ -0,0 +1,20 @@
+---
+cloud_service_group: ContainerInstances
+cloud_service_type: Container
+name: Count by Region
+query:
+ aggregate:
+ - group:
+ keys:
+ - name: name
+ key: region_code
+ fields:
+ - name: value
+ operator: count
+options:
+ chart_type: COLUMN
+ name_options:
+ key: name
+ reference:
+ resource_type: inventory.Region
+ reference_key: region_code
\ No newline at end of file
diff --git a/src/spaceone/inventory/model/container_instances/widget/container_instances_total_container_count.yaml b/src/spaceone/inventory/model/container_instances/widget/container_instances_total_container_count.yaml
new file mode 100644
index 00000000..0b3e63b1
--- /dev/null
+++ b/src/spaceone/inventory/model/container_instances/widget/container_instances_total_container_count.yaml
@@ -0,0 +1,16 @@
+---
+cloud_service_group: ContainerInstances
+cloud_service_type: Container
+name: Total Container Count
+query:
+ aggregate:
+ - group:
+ fields:
+ - name: value
+ key: data.containers
+ operator: sum
+options:
+ value_options:
+ key: value
+ options:
+ default: 0
diff --git a/src/spaceone/inventory/model/container_instances/widget/container_instances_total_count.yaml b/src/spaceone/inventory/model/container_instances/widget/container_instances_total_count.yaml
new file mode 100644
index 00000000..64e80953
--- /dev/null
+++ b/src/spaceone/inventory/model/container_instances/widget/container_instances_total_count.yaml
@@ -0,0 +1,16 @@
+---
+cloud_service_group: ContainerInstances
+cloud_service_type: Container
+name: Total Count
+query:
+ aggregate:
+ - group:
+ fields:
+ - name: value
+ operator: count
+options:
+ value_options:
+ key: value
+ type: count
+ options:
+ default: 0
diff --git a/src/spaceone/inventory/model/container_instances/widget/container_instances_total_gpu_count.yaml b/src/spaceone/inventory/model/container_instances/widget/container_instances_total_gpu_count.yaml
new file mode 100644
index 00000000..6f8b99f9
--- /dev/null
+++ b/src/spaceone/inventory/model/container_instances/widget/container_instances_total_gpu_count.yaml
@@ -0,0 +1,16 @@
+---
+cloud_service_group: ContainerInstances
+cloud_service_type: Container
+name: Total Gpu Count
+query:
+ aggregate:
+ - group:
+ fields:
+ - name: value
+ key: data.containers.resources.requests.gpu.count
+ operator: sum
+options:
+ value_options:
+ key: value
+ options:
+ default: 0
diff --git a/src/spaceone/inventory/model/container_instances/widget/container_instances_total_memory_size.yaml b/src/spaceone/inventory/model/container_instances/widget/container_instances_total_memory_size.yaml
new file mode 100644
index 00000000..5dd8a435
--- /dev/null
+++ b/src/spaceone/inventory/model/container_instances/widget/container_instances_total_memory_size.yaml
@@ -0,0 +1,18 @@
+---
+cloud_service_group: ContainerInstances
+cloud_service_type: Container
+name: Total Memory Size
+query:
+ aggregate:
+ - group:
+ fields:
+ - name: value
+ key: data.containers.resources.requests.memory_in_gb
+ operator: sum
+options:
+ value_options:
+ key: value
+ type: size
+ options:
+ default: 0
+ source_unit: GB
diff --git a/src/spaceone/inventory/model/container_instances/widget/container_instances_total_vcpu_count.yaml b/src/spaceone/inventory/model/container_instances/widget/container_instances_total_vcpu_count.yaml
new file mode 100644
index 00000000..f4178ea2
--- /dev/null
+++ b/src/spaceone/inventory/model/container_instances/widget/container_instances_total_vcpu_count.yaml
@@ -0,0 +1,16 @@
+---
+cloud_service_group: ContainerInstances
+cloud_service_type: Container
+name: Total vCPU Count
+query:
+ aggregate:
+ - group:
+ fields:
+ - name: value
+ key: data.containers.resources.requests.cpu
+ operator: sum
+options:
+ value_options:
+ key: value
+ options:
+ default: 0