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