diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 85af0b08ea3..d602a987eb2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -329,3 +329,5 @@ /src/zones/ @nielsams /src/vme/ @caoyihua + +/src/carbon/ @itiinani diff --git a/src/carbon/HISTORY.rst b/src/carbon/HISTORY.rst new file mode 100644 index 00000000000..abbff5a61a7 --- /dev/null +++ b/src/carbon/HISTORY.rst @@ -0,0 +1,8 @@ +.. :changelog: + +Release History +=============== + +1.0.0b1 +++++++ +* Initial release. \ No newline at end of file diff --git a/src/carbon/README.md b/src/carbon/README.md new file mode 100644 index 00000000000..478b101ce6f --- /dev/null +++ b/src/carbon/README.md @@ -0,0 +1,44 @@ +# Azure CLI Carbon Extension # +This is an extension to Azure CLI to manage Carbon resources. + +## How to use ## +Install this extension using the below CLI command +``` +az extension add --name carbon +``` +### Included Features + +##### Get emission data available date range. +``` +az carbon get-emission-data-available-date-range +``` + +##### Get emission report - overall summary. + +``` +az carbon get-emission-report --subscription-list [00000000-0000-0000-0000-000000000000] --date-range '{start:2024-04-01,end:2025-04-01}' --carbon-scope-list [Scope1,Scope2,Scope3] --overall-summary +``` + +##### Get emission report - monthly summary + +``` +az carbon get-emission-report --subscription-list [00000000-0000-0000-0000-000000000000] --date-range '{start:2024-04-01,end:2025-04-01}' --carbon-scope-list [Scope1,Scope2,Scope3] --monthly-summary +``` + +##### Get emission report - item details + +``` +az carbon get-emission-report --subscription-list [00000000-0000-0000-0000-000000000000] --date-range '{start:2025-04-01,end:2025-04-01}' --carbon-scope-list [Scope1,Scope2,Scope3] --item-details "{category-type:ResourceType,order-by:ItemName,page-size:10,sort-direction:desc}" +``` + +##### Get emission report - top items summary + +``` +az carbon get-emission-report --subscription-list [00000000-0000-0000-0000-000000000000] --date-range '{start:2025-04-01,end:2025-04-01}' --carbon-scope-list [Scope1,Scope2,Scope3] --top-items-summary "{category-type:ResourceType,top-items:5}" +``` + +##### Get emission report - top items monthly summary + +``` +az carbon get-emission-report --subscription-list [00000000-0000-0000-0000-000000000000] --date-range '{start:2024-04-01,end:2025-04-01}' --carbon-scope-list [Scope1,Scope2,Scope3] --top-items-monthly "{category-type:ResourceType,top-items:5}" +``` \ No newline at end of file diff --git a/src/carbon/azext_carbon/__init__.py b/src/carbon/azext_carbon/__init__.py new file mode 100644 index 00000000000..446bea92bf3 --- /dev/null +++ b/src/carbon/azext_carbon/__init__.py @@ -0,0 +1,42 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +from azure.cli.core import AzCommandsLoader +from azext_carbon._help import helps # pylint: disable=unused-import + + +class CarbonCommandsLoader(AzCommandsLoader): + + def __init__(self, cli_ctx=None): + from azure.cli.core.commands import CliCommandType + custom_command_type = CliCommandType( + operations_tmpl='azext_carbon.custom#{}') + super().__init__(cli_ctx=cli_ctx, + custom_command_type=custom_command_type) + + def load_command_table(self, args): + from azext_carbon.commands import load_command_table + from azure.cli.core.aaz import load_aaz_command_table + try: + from . import aaz + except ImportError: + aaz = None + if aaz: + load_aaz_command_table( + loader=self, + aaz_pkg_name=aaz.__name__, + args=args + ) + load_command_table(self, args) + return self.command_table + + def load_arguments(self, command): + from azext_carbon._params import load_arguments + load_arguments(self, command) + + +COMMAND_LOADER_CLS = CarbonCommandsLoader diff --git a/src/carbon/azext_carbon/_help.py b/src/carbon/azext_carbon/_help.py new file mode 100644 index 00000000000..126d5d00714 --- /dev/null +++ b/src/carbon/azext_carbon/_help.py @@ -0,0 +1,11 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: disable=line-too-long +# pylint: disable=too-many-lines + +from knack.help_files import helps # pylint: disable=unused-import diff --git a/src/carbon/azext_carbon/_params.py b/src/carbon/azext_carbon/_params.py new file mode 100644 index 00000000000..cfcec717c9c --- /dev/null +++ b/src/carbon/azext_carbon/_params.py @@ -0,0 +1,13 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: disable=too-many-lines +# pylint: disable=too-many-statements + + +def load_arguments(self, _): # pylint: disable=unused-argument + pass diff --git a/src/carbon/azext_carbon/aaz/__init__.py b/src/carbon/azext_carbon/aaz/__init__.py new file mode 100644 index 00000000000..5757aea3175 --- /dev/null +++ b/src/carbon/azext_carbon/aaz/__init__.py @@ -0,0 +1,6 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- diff --git a/src/carbon/azext_carbon/aaz/latest/__init__.py b/src/carbon/azext_carbon/aaz/latest/__init__.py new file mode 100644 index 00000000000..f6acc11aa4e --- /dev/null +++ b/src/carbon/azext_carbon/aaz/latest/__init__.py @@ -0,0 +1,10 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + diff --git a/src/carbon/azext_carbon/aaz/latest/carbon/__cmd_group.py b/src/carbon/azext_carbon/aaz/latest/carbon/__cmd_group.py new file mode 100644 index 00000000000..18fdf7f056f --- /dev/null +++ b/src/carbon/azext_carbon/aaz/latest/carbon/__cmd_group.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command_group( + "carbon", +) +class __CMDGroup(AAZCommandGroup): + """Manage Carbon + """ + pass + + +__all__ = ["__CMDGroup"] diff --git a/src/carbon/azext_carbon/aaz/latest/carbon/__init__.py b/src/carbon/azext_carbon/aaz/latest/carbon/__init__.py new file mode 100644 index 00000000000..9083ffbd694 --- /dev/null +++ b/src/carbon/azext_carbon/aaz/latest/carbon/__init__.py @@ -0,0 +1,13 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from .__cmd_group import * +from ._get_emission_data_available_date_range import * +from ._get_emission_report import * diff --git a/src/carbon/azext_carbon/aaz/latest/carbon/_get_emission_data_available_date_range.py b/src/carbon/azext_carbon/aaz/latest/carbon/_get_emission_data_available_date_range.py new file mode 100644 index 00000000000..ede86a9bcac --- /dev/null +++ b/src/carbon/azext_carbon/aaz/latest/carbon/_get_emission_data_available_date_range.py @@ -0,0 +1,132 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "carbon get-emission-data-available-date-range", +) +class GetEmissionDataAvailableDateRange(AAZCommand): + """API for query carbon emission data available date range + + :example: Query Carbon Emission Data Available Date Range + az carbon get-emission-data-available-date-range + """ + + _aaz_info = { + "version": "2025-04-01", + "resources": [ + ["mgmt-plane", "/providers/microsoft.carbon/querycarbonemissiondataavailabledaterange", "2025-04-01"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + def _execute_operations(self): + self.pre_operations() + self.CarbonServiceQueryCarbonEmissionDataAvailableDateRange(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class CarbonServiceQueryCarbonEmissionDataAvailableDateRange(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Carbon/queryCarbonEmissionDataAvailableDateRange", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2025-04-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.end_date = AAZStrType( + serialized_name="endDate", + flags={"required": True}, + ) + _schema_on_200.start_date = AAZStrType( + serialized_name="startDate", + flags={"required": True}, + ) + + return cls._schema_on_200 + + +class _GetEmissionDataAvailableDateRangeHelper: + """Helper class for GetEmissionDataAvailableDateRange""" + + +__all__ = ["GetEmissionDataAvailableDateRange"] diff --git a/src/carbon/azext_carbon/aaz/latest/carbon/_get_emission_report.py b/src/carbon/azext_carbon/aaz/latest/carbon/_get_emission_report.py new file mode 100644 index 00000000000..e5bb29a3666 --- /dev/null +++ b/src/carbon/azext_carbon/aaz/latest/carbon/_get_emission_report.py @@ -0,0 +1,596 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: skip-file +# flake8: noqa + +from azure.cli.core.aaz import * + + +@register_command( + "carbon get-emission-report", +) +class GetEmissionReport(AAZCommand): + """API for Carbon Emissions Reports + + :example: QueryCarbonEmission Overall Summary Report + az carbon get-emission-report --subscription-list "[00000000-0000-0000-0000-000000000000]" --carbon-scope-list "[Scope1,Scope2,Scope3]" --date-range "{start:2024-03-01,end:2025-03-01}" --overall-summary + + :example: QueryCarbonEmission Monthly Summary Report + az carbon get-emission-report --subscription-list "[00000000-0000-0000-0000-000000000000]" --carbon-scope-list "[Scope1,Scope2,Scope3]" --date-range "{start:2024-03-01,end:2025-03-01}" --monthly-summary + + :example: QueryCarbonEmission Item Details Report + az carbon get-emission-report --subscription-list "[00000000-0000-0000-0000-000000000000,00000000-0000-0000-0000-000000000001]" --carbon-scope-list "[Scope1,Scope2,Scope3]" --date-range "{start:2025-03-01,end:2025-03-01}" --item-details "{category-type:ResourceType,order-by:itemName,page-size:10,sort-direction:asc}" + + :example: QueryCarbonEmission Top Items Summary Report + az carbon get-emission-report --subscription-list "[00000000-0000-0000-0000-000000000000,00000000-0000-0000-0000-000000000001]" --carbon-scope-list "[Scope1,Scope2,Scope3]" --date-range "{start:2025-03-01,end:2025-03-01}" --top-items-summary "{category-type:ResourceType,top-items:5}" + + :example: QueryCarbonEmission Top Items Monthly Summary Report + az carbon get-emission-report --subscription-list "[00000000-0000-0000-0000-000000000000]" --carbon-scope-list "[Scope1,Scope2,Scope3]" --date-range "{start:2024-03-01,end:2025-03-01}" --top-items-monthly "{category-type:ResourceType,top-items:5} + """ + + _aaz_info = { + "version": "2025-04-01", + "resources": [ + ["mgmt-plane", "/providers/microsoft.carbon/carbonemissionreports", "2025-04-01"], + ] + } + + def _handler(self, command_args): + super()._handler(command_args) + self._execute_operations() + return self._output() + + _args_schema = None + + @classmethod + def _build_arguments_schema(cls, *args, **kwargs): + if cls._args_schema is not None: + return cls._args_schema + cls._args_schema = super()._build_arguments_schema(*args, **kwargs) + + # define Arg Group "QueryParameters" + + _args_schema = cls._args_schema + _args_schema.item_details = AAZObjectArg( + options=["--item-details"], + arg_group="QueryParameters", + help="Use this option to get the Item Details Report", + ) + _args_schema.monthly_summary = AAZObjectArg( + options=["--monthly-summary"], + arg_group="QueryParameters", + help="Use this option to get Monthly summary report", + blank={}, + ) + _args_schema.overall_summary = AAZObjectArg( + options=["--overall-summary"], + arg_group="QueryParameters", + help="Use this option to get overall summary report", + blank={}, + ) + _args_schema.top_items_monthly = AAZObjectArg( + options=["--top-items-monthly"], + arg_group="QueryParameters", + help="Use this option to get the Top Items Monthly Summary Report", + ) + _args_schema.top_items_summary = AAZObjectArg( + options=["--top-items-summary"], + arg_group="QueryParameters", + help="Use this option to get Top Items Summary Report", + ) + _args_schema.carbon_scope_list = AAZListArg( + options=["--carbon-scope-list"], + arg_group="QueryParameters", + help="List of carbon emission scopes. Required. Accepts one or more values from EmissionScopeEnum (e.g., Scope1, Scope2, Scope3) in list form. The output will include the total emissions for the specified scopes.", + required=True, + ) + _args_schema.date_range = AAZObjectArg( + options=["--date-range"], + arg_group="QueryParameters", + help="The start and end dates for carbon emissions data. Required. For ItemDetailsReport and TopItemsSummaryReport, only one month of data is supported at a time, so start and end dates should be equal within DateRange (e.g., start: 2024-06-01 and end: 2024-06-01).", + required=True, + ) + _args_schema.location_list = AAZListArg( + options=["--location-list"], + arg_group="QueryParameters", + help="List of locations(Azure Region Display Name) for carbon emissions data, with each location specified in lowercase (e.g., 'east us'). Optional. You can use the command 'az account list-locations -o table' to find Azure Region Display Names.", + ) + _args_schema.resource_group_urls = AAZListArg( + options=["--resource-group-urls"], + arg_group="QueryParameters", + help="List of resource group URLs for carbon emissions data. Optional. Each URL must follow the format '/subscriptions/{subscriptionId}/resourcegroups/{resourceGroup}', and should be in all lowercase.", + ) + _args_schema.resource_type_list = AAZListArg( + options=["--resource-type-list"], + arg_group="QueryParameters", + help="List of resource types for carbon emissions data. Optional. Each resource type should be specified in lowercase, following the format 'microsoft.{service}/{resourceType}', e.g., 'microsoft.storage/storageaccounts'.", + ) + _args_schema.subscription_list = AAZListArg( + options=["--subscription-list"], + arg_group="QueryParameters", + help="List of subscription IDs for which carbon emissions data is requested. Required. Each subscription ID should be in lowercase format. The max length of list is 100.", + required=True, + ) + + item_details = cls._args_schema.item_details + item_details.category_type = AAZStrArg( + options=["category-type"], + help="Specifies the category type for detailed emissions data, such as Resource, ResourceGroup, ResourceType, Location, or Subscription.", + required=True, + enum={"Location": "Location", "Resource": "Resource", "ResourceGroup": "ResourceGroup", "ResourceType": "ResourceType", "Subscription": "Subscription"}, + ) + item_details.order_by = AAZStrArg( + options=["order-by"], + help="The column name to order the results by. Supported values: ItemName, LatestMonthEmissions, MonthOverMonthEmissionsChangeRatio, MonthlyEmissionsChangeValue, PreviousMonthEmissions, ResourceGroup.", + required=True, + enum={"ItemName": "ItemName", "LatestMonthEmissions": "LatestMonthEmissions", "MonthOverMonthEmissionsChangeRatio": "MonthOverMonthEmissionsChangeRatio", "MonthlyEmissionsChangeValue": "MonthlyEmissionsChangeValue", "PreviousMonthEmissions": "PreviousMonthEmissions", "ResourceGroup": "ResourceGroup"}, + ) + item_details.page_size = AAZIntArg( + options=["page-size"], + help="Number of items to return in one request, max value is 5000.", + required=True, + fmt=AAZIntArgFormat( + maximum=5000, + minimum=1, + ), + ) + item_details.skip_token = AAZStrArg( + options=["skip-token"], + help="Pagination token for fetching the next page of data. This token is nullable and will be returned in the previous response if additional data pages are available.", + ) + item_details.sort_direction = AAZStrArg( + options=["sort-direction"], + help="Direction for sorting results. Supported Values: Asc, Desc.", + required=True, + enum={"Asc": "Asc", "Desc": "Desc"}, + ) + + top_items_monthly = cls._args_schema.top_items_monthly + top_items_monthly.category_type = AAZStrArg( + options=["category-type"], + help="Specifies the category type to retrieve top-emitting items, aggregated by month. Supported types: Location, Resource, ResourceGroup, ResourceType, Subscription.", + required=True, + enum={"Location": "Location", "Resource": "Resource", "ResourceGroup": "ResourceGroup", "ResourceType": "ResourceType", "Subscription": "Subscription"}, + ) + top_items_monthly.top_items = AAZIntArg( + options=["top-items"], + help="The number of top items to return, based on emissions. Must be between 1 and 10.", + required=True, + fmt=AAZIntArgFormat( + maximum=10, + minimum=1, + ), + ) + + top_items_summary = cls._args_schema.top_items_summary + top_items_summary.category_type = AAZStrArg( + options=["category-type"], + help="Specifies the category type for which to retrieve top-emitting items. Supported types: Location, Resource, ResourceGroup, ResourceType, Subscription.", + required=True, + enum={"Location": "Location", "Resource": "Resource", "ResourceGroup": "ResourceGroup", "ResourceType": "ResourceType", "Subscription": "Subscription"}, + ) + top_items_summary.top_items = AAZIntArg( + options=["top-items"], + help="The number of top items to return, based on emissions. This value must be between 1 and 10.", + required=True, + fmt=AAZIntArgFormat( + maximum=10, + minimum=1, + ), + ) + + carbon_scope_list = cls._args_schema.carbon_scope_list + carbon_scope_list.Element = AAZStrArg( + enum={"Scope1": "Scope1", "Scope2": "Scope2", "Scope3": "Scope3"}, + ) + + date_range = cls._args_schema.date_range + date_range.end = AAZDateArg( + options=["end"], + help="End date parameter in yyyy-MM-01 format. Only the first day of each month is accepted.", + required=True, + ) + date_range.start = AAZDateArg( + options=["start"], + help="Start date parameter in yyyy-MM-01 format. Only the first day of each month is accepted.", + required=True, + ) + + location_list = cls._args_schema.location_list + location_list.Element = AAZStrArg() + + resource_group_urls = cls._args_schema.resource_group_urls + resource_group_urls.Element = AAZStrArg() + + resource_type_list = cls._args_schema.resource_type_list + resource_type_list.Element = AAZStrArg() + + subscription_list = cls._args_schema.subscription_list + subscription_list.Element = AAZStrArg() + return cls._args_schema + + def _execute_operations(self): + self.pre_operations() + self.CarbonServiceQueryCarbonEmissionReports(ctx=self.ctx)() + self.post_operations() + + @register_callback + def pre_operations(self): + pass + + @register_callback + def post_operations(self): + pass + + def _output(self, *args, **kwargs): + result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True) + return result + + class CarbonServiceQueryCarbonEmissionReports(AAZHttpOperation): + CLIENT_TYPE = "MgmtClient" + + def __call__(self, *args, **kwargs): + request = self.make_request() + session = self.client.send_request(request=request, stream=False, **kwargs) + if session.http_response.status_code in [200]: + return self.on_200(session) + + return self.on_error(session.http_response) + + @property + def url(self): + return self.client.format_url( + "/providers/Microsoft.Carbon/carbonEmissionReports", + **self.url_parameters + ) + + @property + def method(self): + return "POST" + + @property + def error_format(self): + return "MgmtErrorFormat" + + @property + def query_parameters(self): + parameters = { + **self.serialize_query_param( + "api-version", "2025-04-01", + required=True, + ), + } + return parameters + + @property + def header_parameters(self): + parameters = { + **self.serialize_header_param( + "Content-Type", "application/json", + ), + **self.serialize_header_param( + "Accept", "application/json", + ), + } + return parameters + + @property + def content(self): + _content_value, _builder = self.new_content_builder( + self.ctx.args, + typ=AAZObjectType, + typ_kwargs={"flags": {"required": True, "client_flatten": True}} + ) + _builder.set_prop("carbonScopeList", AAZListType, ".carbon_scope_list", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("dateRange", AAZObjectType, ".date_range", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("locationList", AAZListType, ".location_list") + _builder.set_const("reportType", "ItemDetailsReport", AAZStrType, ".item_details", typ_kwargs={"flags": {"required": True}}) + _builder.set_const("reportType", "MonthlySummaryReport", AAZStrType, ".monthly_summary", typ_kwargs={"flags": {"required": True}}) + _builder.set_const("reportType", "OverallSummaryReport", AAZStrType, ".overall_summary", typ_kwargs={"flags": {"required": True}}) + _builder.set_const("reportType", "TopItemsMonthlySummaryReport", AAZStrType, ".top_items_monthly", typ_kwargs={"flags": {"required": True}}) + _builder.set_const("reportType", "TopItemsSummaryReport", AAZStrType, ".top_items_summary", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("resourceGroupUrlList", AAZListType, ".resource_group_urls") + _builder.set_prop("resourceTypeList", AAZListType, ".resource_type_list") + _builder.set_prop("subscriptionList", AAZListType, ".subscription_list", typ_kwargs={"flags": {"required": True}}) + _builder.discriminate_by("reportType", "ItemDetailsReport") + _builder.discriminate_by("reportType", "MonthlySummaryReport") + _builder.discriminate_by("reportType", "OverallSummaryReport") + _builder.discriminate_by("reportType", "TopItemsMonthlySummaryReport") + _builder.discriminate_by("reportType", "TopItemsSummaryReport") + + carbon_scope_list = _builder.get(".carbonScopeList") + if carbon_scope_list is not None: + carbon_scope_list.set_elements(AAZStrType, ".") + + date_range = _builder.get(".dateRange") + if date_range is not None: + date_range.set_prop("end", AAZStrType, ".end", typ_kwargs={"flags": {"required": True}}) + date_range.set_prop("start", AAZStrType, ".start", typ_kwargs={"flags": {"required": True}}) + + location_list = _builder.get(".locationList") + if location_list is not None: + location_list.set_elements(AAZStrType, ".") + + resource_group_url_list = _builder.get(".resourceGroupUrlList") + if resource_group_url_list is not None: + resource_group_url_list.set_elements(AAZStrType, ".") + + resource_type_list = _builder.get(".resourceTypeList") + if resource_type_list is not None: + resource_type_list.set_elements(AAZStrType, ".") + + subscription_list = _builder.get(".subscriptionList") + if subscription_list is not None: + subscription_list.set_elements(AAZStrType, ".") + + disc_item_details_report = _builder.get("{reportType:ItemDetailsReport}") + if disc_item_details_report is not None: + disc_item_details_report.set_prop("categoryType", AAZStrType, ".item_details.category_type", typ_kwargs={"flags": {"required": True}}) + disc_item_details_report.set_prop("orderBy", AAZStrType, ".item_details.order_by", typ_kwargs={"flags": {"required": True}}) + disc_item_details_report.set_prop("pageSize", AAZIntType, ".item_details.page_size", typ_kwargs={"flags": {"required": True}}) + disc_item_details_report.set_prop("skipToken", AAZStrType, ".item_details.skip_token") + disc_item_details_report.set_prop("sortDirection", AAZStrType, ".item_details.sort_direction", typ_kwargs={"flags": {"required": True}}) + + disc_top_items_monthly_summary_report = _builder.get("{reportType:TopItemsMonthlySummaryReport}") + if disc_top_items_monthly_summary_report is not None: + disc_top_items_monthly_summary_report.set_prop("categoryType", AAZStrType, ".top_items_monthly.category_type", typ_kwargs={"flags": {"required": True}}) + disc_top_items_monthly_summary_report.set_prop("topItems", AAZIntType, ".top_items_monthly.top_items", typ_kwargs={"flags": {"required": True}}) + + disc_top_items_summary_report = _builder.get("{reportType:TopItemsSummaryReport}") + if disc_top_items_summary_report is not None: + disc_top_items_summary_report.set_prop("categoryType", AAZStrType, ".top_items_summary.category_type", typ_kwargs={"flags": {"required": True}}) + disc_top_items_summary_report.set_prop("topItems", AAZIntType, ".top_items_summary.top_items", typ_kwargs={"flags": {"required": True}}) + + return self.serialize_content(_content_value) + + def on_200(self, session): + data = self.deserialize_http_content(session) + self.ctx.set_var( + "instance", + data, + schema_builder=self._build_schema_on_200 + ) + + _schema_on_200 = None + + @classmethod + def _build_schema_on_200(cls): + if cls._schema_on_200 is not None: + return cls._schema_on_200 + + cls._schema_on_200 = AAZObjectType() + + _schema_on_200 = cls._schema_on_200 + _schema_on_200.skip_token = AAZStrType( + serialized_name="skipToken", + ) + _schema_on_200.subscription_access_decision_list = AAZListType( + serialized_name="subscriptionAccessDecisionList", + ) + _schema_on_200.value = AAZListType( + flags={"required": True}, + ) + + subscription_access_decision_list = cls._schema_on_200.subscription_access_decision_list + subscription_access_decision_list.Element = AAZObjectType() + + _element = cls._schema_on_200.subscription_access_decision_list.Element + _element.decision = AAZStrType( + flags={"required": True}, + ) + _element.denial_reason = AAZStrType( + serialized_name="denialReason", + ) + _element.subscription_id = AAZStrType( + serialized_name="subscriptionId", + flags={"required": True}, + ) + + value = cls._schema_on_200.value + value.Element = AAZObjectType() + + _element = cls._schema_on_200.value.Element + _element.data_type = AAZStrType( + serialized_name="dataType", + flags={"required": True}, + ) + _element.latest_month_emissions = AAZFloatType( + serialized_name="latestMonthEmissions", + flags={"required": True}, + ) + _element.month_over_month_emissions_change_ratio = AAZFloatType( + serialized_name="monthOverMonthEmissionsChangeRatio", + ) + _element.monthly_emissions_change_value = AAZFloatType( + serialized_name="monthlyEmissionsChangeValue", + ) + _element.previous_month_emissions = AAZFloatType( + serialized_name="previousMonthEmissions", + flags={"required": True}, + ) + + disc_item_details_data = cls._schema_on_200.value.Element.discriminate_by("data_type", "ItemDetailsData") + disc_item_details_data.category_type = AAZStrType( + serialized_name="categoryType", + flags={"required": True}, + ) + disc_item_details_data.item_name = AAZStrType( + serialized_name="itemName", + flags={"required": True}, + ) + + disc_monthly_summary_data = cls._schema_on_200.value.Element.discriminate_by("data_type", "MonthlySummaryData") + disc_monthly_summary_data.carbon_intensity = AAZFloatType( + serialized_name="carbonIntensity", + flags={"required": True}, + ) + disc_monthly_summary_data.date = AAZStrType( + flags={"required": True}, + ) + + disc_resource_group_item_details_data = cls._schema_on_200.value.Element.discriminate_by("data_type", "ResourceGroupItemDetailsData") + disc_resource_group_item_details_data.category_type = AAZStrType( + serialized_name="categoryType", + flags={"required": True}, + ) + disc_resource_group_item_details_data.item_name = AAZStrType( + serialized_name="itemName", + flags={"required": True}, + ) + disc_resource_group_item_details_data.resource_group_url = AAZStrType( + serialized_name="resourceGroupUrl", + flags={"required": True}, + ) + disc_resource_group_item_details_data.subscription_id = AAZStrType( + serialized_name="subscriptionId", + flags={"required": True}, + ) + + disc_resource_group_top_items_monthly_summary_data = cls._schema_on_200.value.Element.discriminate_by("data_type", "ResourceGroupTopItemsMonthlySummaryData") + disc_resource_group_top_items_monthly_summary_data.category_type = AAZStrType( + serialized_name="categoryType", + flags={"required": True}, + ) + disc_resource_group_top_items_monthly_summary_data.date = AAZStrType( + flags={"required": True}, + ) + disc_resource_group_top_items_monthly_summary_data.item_name = AAZStrType( + serialized_name="itemName", + flags={"required": True}, + ) + disc_resource_group_top_items_monthly_summary_data.resource_group_url = AAZStrType( + serialized_name="resourceGroupUrl", + flags={"required": True}, + ) + disc_resource_group_top_items_monthly_summary_data.subscription_id = AAZStrType( + serialized_name="subscriptionId", + flags={"required": True}, + ) + + disc_resource_group_top_items_summary_data = cls._schema_on_200.value.Element.discriminate_by("data_type", "ResourceGroupTopItemsSummaryData") + disc_resource_group_top_items_summary_data.category_type = AAZStrType( + serialized_name="categoryType", + flags={"required": True}, + ) + disc_resource_group_top_items_summary_data.item_name = AAZStrType( + serialized_name="itemName", + flags={"required": True}, + ) + disc_resource_group_top_items_summary_data.resource_group_url = AAZStrType( + serialized_name="resourceGroupUrl", + flags={"required": True}, + ) + disc_resource_group_top_items_summary_data.subscription_id = AAZStrType( + serialized_name="subscriptionId", + flags={"required": True}, + ) + + disc_resource_item_details_data = cls._schema_on_200.value.Element.discriminate_by("data_type", "ResourceItemDetailsData") + disc_resource_item_details_data.category_type = AAZStrType( + serialized_name="categoryType", + flags={"required": True}, + ) + disc_resource_item_details_data.item_name = AAZStrType( + serialized_name="itemName", + flags={"required": True}, + ) + disc_resource_item_details_data.location = AAZStrType() + disc_resource_item_details_data.resource_group = AAZStrType( + serialized_name="resourceGroup", + flags={"required": True}, + ) + disc_resource_item_details_data.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + disc_resource_item_details_data.resource_type = AAZStrType( + serialized_name="resourceType", + ) + disc_resource_item_details_data.subscription_id = AAZStrType( + serialized_name="subscriptionId", + flags={"required": True}, + ) + + disc_resource_top_items_monthly_summary_data = cls._schema_on_200.value.Element.discriminate_by("data_type", "ResourceTopItemsMonthlySummaryData") + disc_resource_top_items_monthly_summary_data.category_type = AAZStrType( + serialized_name="categoryType", + flags={"required": True}, + ) + disc_resource_top_items_monthly_summary_data.date = AAZStrType( + flags={"required": True}, + ) + disc_resource_top_items_monthly_summary_data.item_name = AAZStrType( + serialized_name="itemName", + flags={"required": True}, + ) + disc_resource_top_items_monthly_summary_data.resource_group = AAZStrType( + serialized_name="resourceGroup", + flags={"required": True}, + ) + disc_resource_top_items_monthly_summary_data.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + disc_resource_top_items_monthly_summary_data.subscription_id = AAZStrType( + serialized_name="subscriptionId", + flags={"required": True}, + ) + + disc_resource_top_items_summary_data = cls._schema_on_200.value.Element.discriminate_by("data_type", "ResourceTopItemsSummaryData") + disc_resource_top_items_summary_data.category_type = AAZStrType( + serialized_name="categoryType", + flags={"required": True}, + ) + disc_resource_top_items_summary_data.item_name = AAZStrType( + serialized_name="itemName", + flags={"required": True}, + ) + disc_resource_top_items_summary_data.resource_group = AAZStrType( + serialized_name="resourceGroup", + flags={"required": True}, + ) + disc_resource_top_items_summary_data.resource_id = AAZStrType( + serialized_name="resourceId", + flags={"required": True}, + ) + disc_resource_top_items_summary_data.subscription_id = AAZStrType( + serialized_name="subscriptionId", + flags={"required": True}, + ) + + disc_top_items_monthly_summary_data = cls._schema_on_200.value.Element.discriminate_by("data_type", "TopItemsMonthlySummaryData") + disc_top_items_monthly_summary_data.category_type = AAZStrType( + serialized_name="categoryType", + flags={"required": True}, + ) + disc_top_items_monthly_summary_data.date = AAZStrType( + flags={"required": True}, + ) + disc_top_items_monthly_summary_data.item_name = AAZStrType( + serialized_name="itemName", + flags={"required": True}, + ) + + disc_top_items_summary_data = cls._schema_on_200.value.Element.discriminate_by("data_type", "TopItemsSummaryData") + disc_top_items_summary_data.category_type = AAZStrType( + serialized_name="categoryType", + flags={"required": True}, + ) + disc_top_items_summary_data.item_name = AAZStrType( + serialized_name="itemName", + flags={"required": True}, + ) + + return cls._schema_on_200 + + +class _GetEmissionReportHelper: + """Helper class for GetEmissionReport""" + + +__all__ = ["GetEmissionReport"] diff --git a/src/carbon/azext_carbon/azext_metadata.json b/src/carbon/azext_carbon/azext_metadata.json new file mode 100644 index 00000000000..e506328978c --- /dev/null +++ b/src/carbon/azext_carbon/azext_metadata.json @@ -0,0 +1,4 @@ +{ + "azext.isPreview": true, + "azext.minCliCoreVersion": "2.70.0" +} \ No newline at end of file diff --git a/src/carbon/azext_carbon/commands.py b/src/carbon/azext_carbon/commands.py new file mode 100644 index 00000000000..b0d842e4993 --- /dev/null +++ b/src/carbon/azext_carbon/commands.py @@ -0,0 +1,15 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: disable=too-many-lines +# pylint: disable=too-many-statements + +# from azure.cli.core.commands import CliCommandType + + +def load_command_table(self, _): # pylint: disable=unused-argument + pass diff --git a/src/carbon/azext_carbon/custom.py b/src/carbon/azext_carbon/custom.py new file mode 100644 index 00000000000..86df1e48ef5 --- /dev/null +++ b/src/carbon/azext_carbon/custom.py @@ -0,0 +1,14 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: disable=too-many-lines +# pylint: disable=too-many-statements + +from knack.log import get_logger + + +logger = get_logger(__name__) diff --git a/src/carbon/azext_carbon/tests/__init__.py b/src/carbon/azext_carbon/tests/__init__.py new file mode 100644 index 00000000000..5757aea3175 --- /dev/null +++ b/src/carbon/azext_carbon/tests/__init__.py @@ -0,0 +1,6 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- diff --git a/src/carbon/azext_carbon/tests/latest/__init__.py b/src/carbon/azext_carbon/tests/latest/__init__.py new file mode 100644 index 00000000000..5757aea3175 --- /dev/null +++ b/src/carbon/azext_carbon/tests/latest/__init__.py @@ -0,0 +1,6 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- diff --git a/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_data_available_date_range.yaml b/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_data_available_date_range.yaml new file mode 100644 index 00000000000..6e9865ca5b8 --- /dev/null +++ b/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_data_available_date_range.yaml @@ -0,0 +1,65 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - carbon get-emission-data-available-date-range + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - AZURECLI/2.72.0 azsdk-python-core/1.31.0 Python/3.11.9 (Windows-10-10.0.22631-SP0) + method: POST + uri: https://management.azure.com/providers/Microsoft.Carbon/queryCarbonEmissionDataAvailableDateRange?api-version=2025-04-01 + response: + body: + string: '{"startDate":"2024-03-01","endDate":"2025-03-01"}' + headers: + cache-control: + - no-cache + content-length: + - '49' + content-type: + - application/json; charset=utf-8 + date: + - Fri, 16 May 2025 18:29:52 GMT + expires: + - '-1' + mise-correlation-id: + - 6a605a2b-c340-4776-a789-f21475bcef54 + pragma: + - no-cache + request-context: + - appId=cid-v1:1b30ee95-d108-4b28-8df6-b780a66c5364 + set-cookie: + - ARRAffinity=92cff1672181f3de1ff12b696639b5c8fe7f87b1484ca72975ce446af3251683;Path=/;HttpOnly;Secure;Domain=sustcarbon-webapp-prod-wus.azurewebsites.net + - ARRAffinitySameSite=92cff1672181f3de1ff12b696639b5c8fe7f87b1484ca72975ce446af3251683;Path=/;HttpOnly;SameSite=None;Secure;Domain=sustcarbon-webapp-prod-wus.azurewebsites.net + strict-transport-security: + - max-age=31536000; includeSubDomains + vary: + - Accept-Encoding + x-azure-ref: + - 20250516T182952Z-1794cd57cdbf9txlhC1CO1ua00000000013g000000009zw8 + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-operation-identifier: + - '' + x-ms-providerhub-traffic: + - 'True' + x-ms-ratelimit-remaining-tenant-writes: + - '799' + x-msedge-ref: + - 'Ref A: 6EFA3A0D6CA94CAA9679A2C41CF26EAB Ref B: MWH011020809036 Ref C: 2025-05-16T18:29:51Z' + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +version: 1 diff --git a/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_item_details_report.yaml b/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_item_details_report.yaml new file mode 100644 index 00000000000..88dd7347343 --- /dev/null +++ b/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_item_details_report.yaml @@ -0,0 +1,70 @@ +interactions: +- request: + body: '{"carbonScopeList": ["Scope1", "Scope2", "Scope3"], "dateRange": {"end": + "2025-03-01", "start": "2025-03-01"}, "reportType": "ItemDetailsReport", "subscriptionList": + ["1fcfa925-ad8b-443e-afc9-73038125cc86"], "categoryType": "ResourceType", "orderBy": + "ItemName", "pageSize": 10, "sortDirection": "Asc"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - carbon get-emission-report + Connection: + - keep-alive + Content-Length: + - '302' + Content-Type: + - application/json + ParameterSetName: + - --subscription-list --date-range --carbon-scope-list --item-details + User-Agent: + - AZURECLI/2.72.0 azsdk-python-core/1.31.0 Python/3.11.9 (Windows-10-10.0.22631-SP0) + method: POST + uri: https://management.azure.com/providers/Microsoft.Carbon/carbonEmissionReports?api-version=2025-04-01 + response: + body: + string: '{"value":[{"dataType":"ItemDetailsData","itemName":"microsoft.containerregistry/registries","categoryType":"ResourceType","latestMonthEmissions":1.50206143294108,"previousMonthEmissions":1.52462765378198,"monthOverMonthEmissionsChangeRatio":-0.014801135729708,"monthlyEmissionsChangeValue":-0.0225662208408932},{"dataType":"ItemDetailsData","itemName":"microsoft.datafactory/factories","categoryType":"ResourceType","latestMonthEmissions":0.433054330507948,"previousMonthEmissions":0.395825830265059,"monthOverMonthEmissionsChangeRatio":0.094052730762818,"monthlyEmissionsChangeValue":0.0372285002428885},{"dataType":"ItemDetailsData","itemName":"microsoft.documentdb/databaseaccounts","categoryType":"ResourceType","latestMonthEmissions":0.617627790980332,"previousMonthEmissions":0.312656400085628,"monthOverMonthEmissionsChangeRatio":0.975420272257918,"monthlyEmissionsChangeValue":0.304971390894704},{"dataType":"ItemDetailsData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","latestMonthEmissions":170.364957551656,"previousMonthEmissions":199.860710018915,"monthOverMonthEmissionsChangeRatio":-0.147581545489696,"monthlyEmissionsChangeValue":-29.4957524672594},{"dataType":"ItemDetailsData","itemName":"microsoft.insights/metricalerts","categoryType":"ResourceType","latestMonthEmissions":0.00735755843400025,"previousMonthEmissions":0.00799046378279079,"monthOverMonthEmissionsChangeRatio":-0.0792075861921354,"monthlyEmissionsChangeValue":-0.000632905348790538},{"dataType":"ItemDetailsData","itemName":"microsoft.keyvault/vaults","categoryType":"ResourceType","latestMonthEmissions":1.18764225807615E-05,"previousMonthEmissions":1.176433430563E-05,"monthOverMonthEmissionsChangeRatio":0.00952780431255802,"monthlyEmissionsChangeValue":1.12088275131555E-07},{"dataType":"ItemDetailsData","itemName":"microsoft.kusto/clusters","categoryType":"ResourceType","latestMonthEmissions":11.0909111385652,"previousMonthEmissions":9.4563412289584,"monthOverMonthEmissionsChangeRatio":0.172854370419842,"monthlyEmissionsChangeValue":1.6345699096068},{"dataType":"ItemDetailsData","itemName":"microsoft.machinelearningservices/workspaces","categoryType":"ResourceType","latestMonthEmissions":0.410518430986091,"previousMonthEmissions":0.417345396860212,"monthOverMonthEmissionsChangeRatio":-0.0163580715768793,"monthlyEmissionsChangeValue":-0.00682696587412046},{"dataType":"ItemDetailsData","itemName":"microsoft.security/pricings","categoryType":"ResourceType","latestMonthEmissions":0.039136391334007,"previousMonthEmissions":0.0253798754796085,"monthOverMonthEmissionsChangeRatio":0.542024560579551,"monthlyEmissionsChangeValue":0.0137565158543985},{"dataType":"ItemDetailsData","itemName":"microsoft.sql/servers","categoryType":"ResourceType","latestMonthEmissions":0.305319480269275,"previousMonthEmissions":0.310639576976187,"monthOverMonthEmissionsChangeRatio":-0.01712626819383,"monthlyEmissionsChangeValue":-0.00532009670691208}],"skipToken":"XDhRAFfI84/NMgjjzrqR/XWTt35vREMtrsHqDkPBTLktjoDPcyBZlpcjK3HYmB27gtLOsg+3rLb+zzgWblf0zmkdFyHigaegLtGH/s+LHvKO6JX5nmLPqIK4aIqQUNIvfPBwJyOeXfmFp2uS8a+AMRQsUh7l4GZYhDFsOerUDyRzjYNt5UzEvE08KnA+spttigcVF1j/zJ/JxgQGkaiREm9W6KixCINI2DJjrxNH01Utos2kgJDMh8xx0bFwAPkWsOCMPc54ckSxI5/kn3H65pjYrwub9jIrWFpNxyOBmIslxO9QzJDQcalr2KQD5omfTGXOxvCZiba2xyOQGuh/Bw==|h0SVChyWSnED6uyUfDmx0B+SFwbEPiBxXxPqwM0fDzpmvzANz8PZ/V71nsD88QzqMGPcO5ubxia0fcf67JyXq40ViF/5xHGnQJiQPOIJv/Kf3irpz6gZhjGQ82Rw29t9qRj4QvbvYM04A2n4sM4pZ35nQDrlPShjAszOQAEujUCfCtVLBlI3oQeFE0j4ZKizT2Ary+bSJDwmURLDH5p8EVH12349Iux9ca5f34X4d4sbUOl9G+yIqzxiCSN4j5bzbc1yMmgkSJogWjWhyFnpIPQMsf3Q3vRzG++h/XZKsbEpNVWiXuWx1muqQ87s1wsqTeWLXcyZsELd6P1pFlD/Vw=="}' + headers: + cache-control: + - no-cache + content-length: + - '3665' + content-type: + - application/json; charset=utf-8 + date: + - Fri, 16 May 2025 18:29:52 GMT + expires: + - '-1' + mise-correlation-id: + - 21cdce68-0e24-4543-982b-9a961deee0dd + pragma: + - no-cache + request-context: + - appId=cid-v1:1b30ee95-d108-4b28-8df6-b780a66c5364 + set-cookie: + - ARRAffinity=92cff1672181f3de1ff12b696639b5c8fe7f87b1484ca72975ce446af3251683;Path=/;HttpOnly;Secure;Domain=sustcarbon-webapp-prod-wus.azurewebsites.net + - ARRAffinitySameSite=92cff1672181f3de1ff12b696639b5c8fe7f87b1484ca72975ce446af3251683;Path=/;HttpOnly;SameSite=None;Secure;Domain=sustcarbon-webapp-prod-wus.azurewebsites.net + strict-transport-security: + - max-age=31536000; includeSubDomains + vary: + - Accept-Encoding + x-azure-ref: + - 20250516T182953Z-17bc9bb9bf7pnwzvhC1CYSy1nc00000009q00000000019fy + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-operation-identifier: + - '' + x-ms-providerhub-traffic: + - 'True' + x-msedge-ref: + - 'Ref A: 2FAC711E640346E4A2071D82E6C1D057 Ref B: MWH011020806034 Ref C: 2025-05-16T18:29:52Z' + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +version: 1 diff --git a/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_monthly_summary_report.yaml b/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_monthly_summary_report.yaml new file mode 100644 index 00000000000..5ff1fbbbb21 --- /dev/null +++ b/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_monthly_summary_report.yaml @@ -0,0 +1,69 @@ +interactions: +- request: + body: '{"carbonScopeList": ["Scope1", "Scope2", "Scope3"], "dateRange": {"end": + "2025-03-01", "start": "2024-03-01"}, "reportType": "MonthlySummaryReport", + "subscriptionList": ["1fcfa925-ad8b-443e-afc9-73038125cc86"]}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - carbon get-emission-report + Connection: + - keep-alive + Content-Length: + - '210' + Content-Type: + - application/json + ParameterSetName: + - --subscription-list --date-range --carbon-scope-list --monthly-summary + User-Agent: + - AZURECLI/2.72.0 azsdk-python-core/1.31.0 Python/3.11.9 (Windows-10-10.0.22631-SP0) + method: POST + uri: https://management.azure.com/providers/Microsoft.Carbon/carbonEmissionReports?api-version=2025-04-01 + response: + body: + string: '{"value":[{"dataType":"MonthlySummaryData","date":"2024-03-01","carbonIntensity":0.0170261988257036,"latestMonthEmissions":127.264697099075,"previousMonthEmissions":103.363434855836,"monthOverMonthEmissionsChangeRatio":0.231235177861249,"monthlyEmissionsChangeValue":23.9012622432389},{"dataType":"MonthlySummaryData","date":"2024-04-01","carbonIntensity":0.0339931563188226,"latestMonthEmissions":477.077652156969,"previousMonthEmissions":127.264697099075,"monthOverMonthEmissionsChangeRatio":2.74870378849498,"monthlyEmissionsChangeValue":349.812955057894},{"dataType":"MonthlySummaryData","date":"2024-05-01","carbonIntensity":0.0378519995913714,"latestMonthEmissions":446.00891522622,"previousMonthEmissions":477.077652156969,"monthOverMonthEmissionsChangeRatio":-0.0651230188424896,"monthlyEmissionsChangeValue":-31.068736930749},{"dataType":"MonthlySummaryData","date":"2024-06-01","carbonIntensity":0.0343279807068098,"latestMonthEmissions":410.027128806015,"previousMonthEmissions":446.00891522622,"monthOverMonthEmissionsChangeRatio":-0.080675038529116,"monthlyEmissionsChangeValue":-35.9817864202045},{"dataType":"MonthlySummaryData","date":"2024-07-01","carbonIntensity":0.0262470481920649,"latestMonthEmissions":324.079583749917,"previousMonthEmissions":410.027128806015,"monthOverMonthEmissionsChangeRatio":-0.209614288952963,"monthlyEmissionsChangeValue":-85.9475450560978},{"dataType":"MonthlySummaryData","date":"2024-08-01","carbonIntensity":0.0283019830079276,"latestMonthEmissions":338.414580966828,"previousMonthEmissions":324.079583749917,"monthOverMonthEmissionsChangeRatio":0.0442329536808244,"monthlyEmissionsChangeValue":14.334997216911},{"dataType":"MonthlySummaryData","date":"2024-09-01","carbonIntensity":0.0252361267622333,"latestMonthEmissions":313.900701876921,"previousMonthEmissions":338.414580966828,"monthOverMonthEmissionsChangeRatio":-0.0724374198649259,"monthlyEmissionsChangeValue":-24.5138790899071},{"dataType":"MonthlySummaryData","date":"2024-10-01","carbonIntensity":0.0156194396216124,"latestMonthEmissions":209.356857057996,"previousMonthEmissions":313.900701876921,"monthOverMonthEmissionsChangeRatio":-0.333047502582254,"monthlyEmissionsChangeValue":-104.543844818925},{"dataType":"MonthlySummaryData","date":"2024-11-01","carbonIntensity":0.0167278799465911,"latestMonthEmissions":234.972575589762,"previousMonthEmissions":209.356857057996,"monthOverMonthEmissionsChangeRatio":0.122354332653501,"monthlyEmissionsChangeValue":25.6157185317656},{"dataType":"MonthlySummaryData","date":"2024-12-01","carbonIntensity":0.0159317504832839,"latestMonthEmissions":227.093155878317,"previousMonthEmissions":234.972575589762,"monthOverMonthEmissionsChangeRatio":-0.0335333589107919,"monthlyEmissionsChangeValue":-7.87941971144466},{"dataType":"MonthlySummaryData","date":"2025-01-01","carbonIntensity":0.0151881971247023,"latestMonthEmissions":217.200291580438,"previousMonthEmissions":227.093519360606,"monthOverMonthEmissionsChangeRatio":-0.0435645535285346,"monthlyEmissionsChangeValue":-9.89322778016844},{"dataType":"MonthlySummaryData","date":"2025-02-01","carbonIntensity":0.0178679554927896,"latestMonthEmissions":234.053421017701,"previousMonthEmissions":217.200291580438,"monthOverMonthEmissionsChangeRatio":0.0775925728028856,"monthlyEmissionsChangeValue":16.8531294372631},{"dataType":"MonthlySummaryData","date":"2025-03-01","carbonIntensity":0.0139939611574088,"latestMonthEmissions":205.438889697989,"previousMonthEmissions":234.053421017701,"monthOverMonthEmissionsChangeRatio":-0.122256411358104,"monthlyEmissionsChangeValue":-28.6145313197115}]}' + headers: + cache-control: + - no-cache + content-length: + - '3603' + content-type: + - application/json; charset=utf-8 + date: + - Fri, 16 May 2025 18:29:52 GMT + expires: + - '-1' + mise-correlation-id: + - 1dfc2508-98b9-4a90-8dcb-d5100dd58796 + pragma: + - no-cache + request-context: + - appId=cid-v1:1b30ee95-d108-4b28-8df6-b780a66c5364 + set-cookie: + - ARRAffinity=92cff1672181f3de1ff12b696639b5c8fe7f87b1484ca72975ce446af3251683;Path=/;HttpOnly;Secure;Domain=sustcarbon-webapp-prod-wus.azurewebsites.net + - ARRAffinitySameSite=92cff1672181f3de1ff12b696639b5c8fe7f87b1484ca72975ce446af3251683;Path=/;HttpOnly;SameSite=None;Secure;Domain=sustcarbon-webapp-prod-wus.azurewebsites.net + strict-transport-security: + - max-age=31536000; includeSubDomains + vary: + - Accept-Encoding + x-azure-ref: + - 20250516T182952Z-1794cd57cdbbttrthC1CO1tgzn00000002mg000000002ycr + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-operation-identifier: + - '' + x-ms-providerhub-traffic: + - 'True' + x-msedge-ref: + - 'Ref A: FA4830CFA0624C8E82C0E5A54FBA16C3 Ref B: MWH011020808029 Ref C: 2025-05-16T18:29:52Z' + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +version: 1 diff --git a/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_overall_summary_report.yaml b/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_overall_summary_report.yaml new file mode 100644 index 00000000000..557c30004c5 --- /dev/null +++ b/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_overall_summary_report.yaml @@ -0,0 +1,69 @@ +interactions: +- request: + body: '{"carbonScopeList": ["Scope1", "Scope2", "Scope3"], "dateRange": {"end": + "2025-03-01", "start": "2024-03-01"}, "reportType": "OverallSummaryReport", + "subscriptionList": ["1fcfa925-ad8b-443e-afc9-73038125cc86"]}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - carbon get-emission-report + Connection: + - keep-alive + Content-Length: + - '210' + Content-Type: + - application/json + ParameterSetName: + - --subscription-list --date-range --carbon-scope-list --overall-summary + User-Agent: + - AZURECLI/2.72.0 azsdk-python-core/1.31.0 Python/3.11.9 (Windows-10-10.0.22631-SP0) + method: POST + uri: https://management.azure.com/providers/Microsoft.Carbon/carbonEmissionReports?api-version=2025-04-01 + response: + body: + string: '{"value":[{"dataType":"OverallSummaryData","latestMonthEmissions":3764.88845070415,"previousMonthEmissions":3662.81335934428,"monthOverMonthEmissionsChangeRatio":0.0278679477619186,"monthlyEmissionsChangeValue":102.075091359864}]}' + headers: + cache-control: + - no-cache + content-length: + - '230' + content-type: + - application/json; charset=utf-8 + date: + - Fri, 16 May 2025 18:29:53 GMT + expires: + - '-1' + mise-correlation-id: + - e530c384-0de1-4fdc-be93-359015db5743 + pragma: + - no-cache + request-context: + - appId=cid-v1:1b30ee95-d108-4b28-8df6-b780a66c5364 + set-cookie: + - ARRAffinity=1a1db42e64c24222c8d6c447e0028598d5fe62845b3b315c8b25f53a387e2abb;Path=/;HttpOnly;Secure;Domain=sustcarbon-webapp-prod-wus.azurewebsites.net + - ARRAffinitySameSite=1a1db42e64c24222c8d6c447e0028598d5fe62845b3b315c8b25f53a387e2abb;Path=/;HttpOnly;SameSite=None;Secure;Domain=sustcarbon-webapp-prod-wus.azurewebsites.net + strict-transport-security: + - max-age=31536000; includeSubDomains + vary: + - Accept-Encoding + x-azure-ref: + - 20250516T182952Z-1794cd57cdbwxqfbhC1CO1q4cg000000034g000000000zk9 + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-operation-identifier: + - '' + x-ms-providerhub-traffic: + - 'True' + x-msedge-ref: + - 'Ref A: 07FA43F501ED4B98B1B17EB48F8AE84E Ref B: CO6AA3150220047 Ref C: 2025-05-16T18:29:52Z' + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +version: 1 diff --git a/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_top_items_monthly_summary_report.yaml b/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_top_items_monthly_summary_report.yaml new file mode 100644 index 00000000000..6cf31458628 --- /dev/null +++ b/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_top_items_monthly_summary_report.yaml @@ -0,0 +1,70 @@ +interactions: +- request: + body: '{"carbonScopeList": ["Scope1", "Scope2", "Scope3"], "dateRange": {"end": + "2025-03-01", "start": "2024-03-01"}, "reportType": "TopItemsMonthlySummaryReport", + "subscriptionList": ["1fcfa925-ad8b-443e-afc9-73038125cc86"], "categoryType": + "ResourceType", "topItems": 5}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - carbon get-emission-report + Connection: + - keep-alive + Content-Length: + - '265' + Content-Type: + - application/json + ParameterSetName: + - --subscription-list --date-range --carbon-scope-list --top-items-monthly + User-Agent: + - AZURECLI/2.72.0 azsdk-python-core/1.31.0 Python/3.11.9 (Windows-10-10.0.22631-SP0) + method: POST + uri: https://management.azure.com/providers/Microsoft.Carbon/carbonEmissionReports?api-version=2025-04-01 + response: + body: + string: '{"value":[{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","date":"2024-03-01","latestMonthEmissions":27.8081301576963,"previousMonthEmissions":0,"monthOverMonthEmissionsChangeRatio":0,"monthlyEmissionsChangeValue":27.8081301576963},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","date":"2024-04-01","latestMonthEmissions":406.564620192979,"previousMonthEmissions":27.8081301576963,"monthOverMonthEmissionsChangeRatio":13.6203508789481,"monthlyEmissionsChangeValue":378.756490035283},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","date":"2024-05-01","latestMonthEmissions":414.519390591609,"previousMonthEmissions":406.564620192979,"monthOverMonthEmissionsChangeRatio":0.0195658205449693,"monthlyEmissionsChangeValue":7.95477039862942},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","date":"2024-06-01","latestMonthEmissions":369.741043004636,"previousMonthEmissions":414.519390591609,"monthOverMonthEmissionsChangeRatio":-0.108024735641592,"monthlyEmissionsChangeValue":-44.7783475869725},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","date":"2024-07-01","latestMonthEmissions":289.555688294754,"previousMonthEmissions":369.741043004636,"monthOverMonthEmissionsChangeRatio":-0.216868957955735,"monthlyEmissionsChangeValue":-80.1853547098822},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","date":"2024-08-01","latestMonthEmissions":310.743997423465,"previousMonthEmissions":289.555688294754,"monthOverMonthEmissionsChangeRatio":0.0731752474057507,"monthlyEmissionsChangeValue":21.1883091287111},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","date":"2024-09-01","latestMonthEmissions":277.401826178593,"previousMonthEmissions":310.743997423465,"monthOverMonthEmissionsChangeRatio":-0.107297877099248,"monthlyEmissionsChangeValue":-33.3421712448721},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","date":"2024-10-01","latestMonthEmissions":174.278872274295,"previousMonthEmissions":277.401826178593,"monthOverMonthEmissionsChangeRatio":-0.371745764348021,"monthlyEmissionsChangeValue":-103.122953904298},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","date":"2024-11-01","latestMonthEmissions":197.080391483838,"previousMonthEmissions":174.27808730716,"monthOverMonthEmissionsChangeRatio":0.13083861849189,"monthlyEmissionsChangeValue":22.8023041766778},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","date":"2024-12-01","latestMonthEmissions":192.685788313893,"previousMonthEmissions":197.080391483838,"monthOverMonthEmissionsChangeRatio":-0.0222985307511205,"monthlyEmissionsChangeValue":-4.39460316994521},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","date":"2025-01-01","latestMonthEmissions":183.198004341639,"previousMonthEmissions":192.685776020966,"monthOverMonthEmissionsChangeRatio":-0.0492396059286393,"monthlyEmissionsChangeValue":-9.48777167932641},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","date":"2025-02-01","latestMonthEmissions":199.860710018915,"previousMonthEmissions":183.198004341639,"monthOverMonthEmissionsChangeRatio":0.0909546244084752,"monthlyEmissionsChangeValue":16.662705677276},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","date":"2025-03-01","latestMonthEmissions":170.364957551656,"previousMonthEmissions":199.860710018915,"monthOverMonthEmissionsChangeRatio":-0.147581545489695,"monthlyEmissionsChangeValue":-29.4957524672594},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.kusto/clusters","categoryType":"ResourceType","date":"2024-03-01","latestMonthEmissions":0.00689017885377623,"previousMonthEmissions":0.0075862380864409,"monthOverMonthEmissionsChangeRatio":-0.091752885255309,"monthlyEmissionsChangeValue":-0.000696059232664667},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.kusto/clusters","categoryType":"ResourceType","date":"2024-04-01","latestMonthEmissions":0.00290710472501141,"previousMonthEmissions":0.00689017885377623,"monthOverMonthEmissionsChangeRatio":-0.578079932799111,"monthlyEmissionsChangeValue":-0.00398307412876482},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.kusto/clusters","categoryType":"ResourceType","date":"2024-09-01","latestMonthEmissions":5.51941137190141,"previousMonthEmissions":0,"monthOverMonthEmissionsChangeRatio":0,"monthlyEmissionsChangeValue":5.51941137190141},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.kusto/clusters","categoryType":"ResourceType","date":"2024-10-01","latestMonthEmissions":9.49082792477924,"previousMonthEmissions":5.51940877812077,"monthOverMonthEmissionsChangeRatio":0.719537056650229,"monthlyEmissionsChangeValue":3.97141914665846},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.kusto/clusters","categoryType":"ResourceType","date":"2024-11-01","latestMonthEmissions":9.45116719627849,"previousMonthEmissions":9.49082792477924,"monthOverMonthEmissionsChangeRatio":-0.00417884812737939,"monthlyEmissionsChangeValue":-0.0396607285007438},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.kusto/clusters","categoryType":"ResourceType","date":"2024-12-01","latestMonthEmissions":9.3007380804863,"previousMonthEmissions":9.45116719627849,"monthOverMonthEmissionsChangeRatio":-0.0159164590645926,"monthlyEmissionsChangeValue":-0.150429115792187},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.kusto/clusters","categoryType":"ResourceType","date":"2025-01-01","latestMonthEmissions":8.96909059948458,"previousMonthEmissions":9.30067260514642,"monthOverMonthEmissionsChangeRatio":-0.0356514006823932,"monthlyEmissionsChangeValue":-0.331582005661833},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.kusto/clusters","categoryType":"ResourceType","date":"2025-02-01","latestMonthEmissions":9.4563412289584,"previousMonthEmissions":8.96909059948458,"monthOverMonthEmissionsChangeRatio":0.0543255332376527,"monthlyEmissionsChangeValue":0.487250629473818},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.kusto/clusters","categoryType":"ResourceType","date":"2025-03-01","latestMonthEmissions":11.0909111385652,"previousMonthEmissions":9.4563412289584,"monthOverMonthEmissionsChangeRatio":0.172854370419842,"monthlyEmissionsChangeValue":1.6345699096068},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","date":"2024-03-01","latestMonthEmissions":6.2169779144,"previousMonthEmissions":6.28593216074647,"monthOverMonthEmissionsChangeRatio":-0.0109696135088879,"monthlyEmissionsChangeValue":-0.0689542463464772},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","date":"2024-04-01","latestMonthEmissions":6.04473279594467,"previousMonthEmissions":6.2169779144,"monthOverMonthEmissionsChangeRatio":-0.0277056024368957,"monthlyEmissionsChangeValue":-0.172245118455328},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","date":"2024-05-01","latestMonthEmissions":5.93449029482099,"previousMonthEmissions":6.04473279594467,"monthOverMonthEmissionsChangeRatio":-0.0182377790458564,"monthlyEmissionsChangeValue":-0.110242501123681},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","date":"2024-06-01","latestMonthEmissions":5.73477294901016,"previousMonthEmissions":5.93449029482099,"monthOverMonthEmissionsChangeRatio":-0.033653664575898,"monthlyEmissionsChangeValue":-0.199717345810828},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","date":"2024-07-01","latestMonthEmissions":5.18472533385108,"previousMonthEmissions":5.73477294901016,"monthOverMonthEmissionsChangeRatio":-0.0959144538153028,"monthlyEmissionsChangeValue":-0.550047615159083},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","date":"2024-08-01","latestMonthEmissions":4.84175410014348,"previousMonthEmissions":5.18472533385108,"monthOverMonthEmissionsChangeRatio":-0.0661503187967031,"monthlyEmissionsChangeValue":-0.342971233707591},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","date":"2024-09-01","latestMonthEmissions":4.46160255742105,"previousMonthEmissions":4.84175410014348,"monthOverMonthEmissionsChangeRatio":-0.0785152518817867,"monthlyEmissionsChangeValue":-0.380151542722439},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","date":"2024-10-01","latestMonthEmissions":4.23054307332,"previousMonthEmissions":4.46160255742105,"monthOverMonthEmissionsChangeRatio":-0.051788450702926,"monthlyEmissionsChangeValue":-0.231059484101048},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","date":"2024-11-01","latestMonthEmissions":4.07560864203491,"previousMonthEmissions":4.23054307332,"monthOverMonthEmissionsChangeRatio":-0.0366228232640363,"monthlyEmissionsChangeValue":-0.154934431285091},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","date":"2024-12-01","latestMonthEmissions":3.95337701531159,"previousMonthEmissions":4.07560864203491,"monthOverMonthEmissionsChangeRatio":-0.029991011762673,"monthlyEmissionsChangeValue":-0.122231626723321},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","date":"2025-01-01","latestMonthEmissions":3.88052315162032,"previousMonthEmissions":3.9534538266802,"monthOverMonthEmissionsChangeRatio":-0.0184473319424412,"monthlyEmissionsChangeValue":-0.0729306750598839},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","date":"2025-02-01","latestMonthEmissions":3.69563555963608,"previousMonthEmissions":3.88052315162032,"monthOverMonthEmissionsChangeRatio":-0.0476450171176114,"monthlyEmissionsChangeValue":-0.184887591984237},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","date":"2025-03-01","latestMonthEmissions":3.63518373774172,"previousMonthEmissions":3.69563555963608,"monthOverMonthEmissionsChangeRatio":-0.0163576253445068,"monthlyEmissionsChangeValue":-0.0604518218943637},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","date":"2024-03-01","latestMonthEmissions":11.8297173144782,"previousMonthEmissions":12.7867189498855,"monthOverMonthEmissionsChangeRatio":-0.0748434089431406,"monthlyEmissionsChangeValue":-0.957001635407286},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","date":"2024-04-01","latestMonthEmissions":9.68350897390122,"previousMonthEmissions":11.8297173144782,"monthOverMonthEmissionsChangeRatio":-0.181425158651111,"monthlyEmissionsChangeValue":-2.146208340577},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","date":"2024-05-01","latestMonthEmissions":7.32598056124502,"previousMonthEmissions":7.65114173055995,"monthOverMonthEmissionsChangeRatio":-0.0424983853084548,"monthlyEmissionsChangeValue":-0.325161169314934},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","date":"2024-06-01","latestMonthEmissions":6.59377260373134,"previousMonthEmissions":7.32596484777519,"monthOverMonthEmissionsChangeRatio":-0.0999448208199099,"monthlyEmissionsChangeValue":-0.73219224404385},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","date":"2024-07-01","latestMonthEmissions":5.87824945279818,"previousMonthEmissions":6.59376406161938,"monthOverMonthEmissionsChangeRatio":-0.108513832483942,"monthlyEmissionsChangeValue":-0.715514608821206},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","date":"2024-08-01","latestMonthEmissions":5.1439342535062,"previousMonthEmissions":5.87824945279818,"monthOverMonthEmissionsChangeRatio":-0.124920727707876,"monthlyEmissionsChangeValue":-0.734315199291976},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","date":"2024-09-01","latestMonthEmissions":5.25715737701081,"previousMonthEmissions":5.1439342535062,"monthOverMonthEmissionsChangeRatio":0.0220109974048421,"monthlyEmissionsChangeValue":0.113223123504604},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","date":"2024-10-01","latestMonthEmissions":5.46044015636376,"previousMonthEmissions":5.25715737701081,"monthOverMonthEmissionsChangeRatio":0.0386678131877689,"monthlyEmissionsChangeValue":0.203282779352955},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","date":"2024-11-01","latestMonthEmissions":8.80753402626591,"previousMonthEmissions":5.46044015636376,"monthOverMonthEmissionsChangeRatio":0.612971440773202,"monthlyEmissionsChangeValue":3.34709386990214},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","date":"2024-12-01","latestMonthEmissions":6.08069679760283,"previousMonthEmissions":8.80753402626591,"monthOverMonthEmissionsChangeRatio":-0.309602803750866,"monthlyEmissionsChangeValue":-2.72683722866308},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","date":"2025-01-01","latestMonthEmissions":6.3789924587174,"previousMonthEmissions":6.08081340823422,"monthOverMonthEmissionsChangeRatio":0.0490360467366774,"monthlyEmissionsChangeValue":0.298179050483188},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","date":"2025-02-01","latestMonthEmissions":6.60325276568956,"previousMonthEmissions":6.3789924587174,"monthOverMonthEmissionsChangeRatio":0.035156070245183,"monthlyEmissionsChangeValue":0.224260306972162},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","date":"2025-03-01","latestMonthEmissions":5.73549901502806,"previousMonthEmissions":6.60325276568956,"monthOverMonthEmissionsChangeRatio":-0.131413074957595,"monthlyEmissionsChangeValue":-0.867753750661507},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","date":"2024-03-01","latestMonthEmissions":32.9888636230658,"previousMonthEmissions":33.1388781355637,"monthOverMonthEmissionsChangeRatio":-0.00452684342192317,"monthlyEmissionsChangeValue":-0.15001451249789},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","date":"2024-04-01","latestMonthEmissions":26.544777320504,"previousMonthEmissions":32.9888636230658,"monthOverMonthEmissionsChangeRatio":-0.195341263530401,"monthlyEmissionsChangeValue":-6.44408630256177},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","date":"2024-05-01","latestMonthEmissions":16.646691522476,"previousMonthEmissions":26.544777320504,"monthOverMonthEmissionsChangeRatio":-0.372882608074563,"monthlyEmissionsChangeValue":-9.89808579802806},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","date":"2024-06-01","latestMonthEmissions":16.4223486624618,"previousMonthEmissions":16.646691522476,"monthOverMonthEmissionsChangeRatio":-0.013476723570643,"monthlyEmissionsChangeValue":-0.224342860014175},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","date":"2024-07-01","latestMonthEmissions":18.6832411526843,"previousMonthEmissions":16.0884503280497,"monthOverMonthEmissionsChangeRatio":0.16128283157954,"monthlyEmissionsChangeValue":2.59479082463464},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","date":"2024-08-01","latestMonthEmissions":13.6154762114072,"previousMonthEmissions":18.6832411526843,"monthOverMonthEmissionsChangeRatio":-0.271246562620589,"monthlyEmissionsChangeValue":-5.06776494127716},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","date":"2024-09-01","latestMonthEmissions":12.5136080504181,"previousMonthEmissions":13.6154762114072,"monthOverMonthEmissionsChangeRatio":-0.080927625584328,"monthlyEmissionsChangeValue":-1.10186816098908},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","date":"2024-10-01","latestMonthEmissions":11.8576106923417,"previousMonthEmissions":12.5136080504181,"monthOverMonthEmissionsChangeRatio":-0.0524227189658913,"monthlyEmissionsChangeValue":-0.655997358076382},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","date":"2024-11-01","latestMonthEmissions":11.5232653770724,"previousMonthEmissions":11.8576106923417,"monthOverMonthEmissionsChangeRatio":-0.0281966851454522,"monthlyEmissionsChangeValue":-0.334345315269307},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","date":"2024-12-01","latestMonthEmissions":11.1618227271496,"previousMonthEmissions":11.5232653770724,"monthOverMonthEmissionsChangeRatio":-0.031366339149141,"monthlyEmissionsChangeValue":-0.361442649922807},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","date":"2025-01-01","latestMonthEmissions":10.9331882235823,"previousMonthEmissions":11.16203959361,"monthOverMonthEmissionsChangeRatio":-0.0205026481144831,"monthlyEmissionsChangeValue":-0.228851370027714},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","date":"2025-02-01","latestMonthEmissions":10.4031346841103,"previousMonthEmissions":10.9331882235823,"monthOverMonthEmissionsChangeRatio":-0.0484811501121552,"monthlyEmissionsChangeValue":-0.53005353947194},{"dataType":"TopItemsMonthlySummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","date":"2025-03-01","latestMonthEmissions":10.2741922887871,"previousMonthEmissions":10.4031346841103,"monthOverMonthEmissionsChangeRatio":-0.0123945713708978,"monthlyEmissionsChangeValue":-0.128942395323268},{"dataType":"TopItemsMonthlySummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","date":"2024-03-01","latestMonthEmissions":48.41411791058093,"previousMonthEmissions":51.14431937155389,"monthOverMonthEmissionsChangeRatio":-0.05338230119240739,"monthlyEmissionsChangeValue":-2.7302014609729652},{"dataType":"TopItemsMonthlySummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","date":"2024-04-01","latestMonthEmissions":28.2371057689151,"previousMonthEmissions":48.41411791058093,"monthOverMonthEmissionsChangeRatio":-0.41675885077431374,"monthlyEmissionsChangeValue":-20.177012141665823},{"dataType":"TopItemsMonthlySummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","date":"2024-05-01","latestMonthEmissions":1.58236225606899,"previousMonthEmissions":30.27238011698138,"monthOverMonthEmissionsChangeRatio":-0.9477291759037685,"monthlyEmissionsChangeValue":-28.69001786091239},{"dataType":"TopItemsMonthlySummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","date":"2024-06-01","latestMonthEmissions":11.5351915861757,"previousMonthEmissions":1.58237796953882,"monthOverMonthEmissionsChangeRatio":6.289782724627797,"monthlyEmissionsChangeValue":9.95281361663688},{"dataType":"TopItemsMonthlySummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","date":"2024-07-01","latestMonthEmissions":4.77767951582944,"previousMonthEmissions":11.86909846269976,"monthOverMonthEmissionsChangeRatio":-0.5974690469673041,"monthlyEmissionsChangeValue":-7.09141894687032},{"dataType":"TopItemsMonthlySummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","date":"2024-08-01","latestMonthEmissions":4.06941897830612,"previousMonthEmissions":4.77767951582944,"monthOverMonthEmissionsChangeRatio":-0.14824362646692948,"monthlyEmissionsChangeValue":-0.70826053752332},{"dataType":"TopItemsMonthlySummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","date":"2024-09-01","latestMonthEmissions":8.74709634157663,"previousMonthEmissions":4.06941897830612,"monthOverMonthEmissionsChangeRatio":1.1494705726313723,"monthlyEmissionsChangeValue":4.67767736327051},{"dataType":"TopItemsMonthlySummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","date":"2024-10-01","latestMonthEmissions":4.0385629368963,"previousMonthEmissions":8.74709893535727,"monthOverMonthEmissionsChangeRatio":-0.5382968722839366,"monthlyEmissionsChangeValue":-4.70853599846097},{"dataType":"TopItemsMonthlySummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","date":"2024-11-01","latestMonthEmissions":4.03460886427229,"previousMonthEmissions":4.0393479040313,"monthOverMonthEmissionsChangeRatio":-0.0011732190124748606,"monthlyEmissionsChangeValue":-0.00473903975901},{"dataType":"TopItemsMonthlySummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","date":"2024-12-01","latestMonthEmissions":3.91073294387368,"previousMonthEmissions":4.03460886427229,"monthOverMonthEmissionsChangeRatio":-0.030703328269456206,"monthlyEmissionsChangeValue":-0.12387592039861},{"dataType":"TopItemsMonthlySummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","date":"2025-01-01","latestMonthEmissions":3.8404928053944,"previousMonthEmissions":3.91076390596916,"monthOverMonthEmissionsChangeRatio":-0.01796863790920805,"monthlyEmissionsChangeValue":-0.07027110057476},{"dataType":"TopItemsMonthlySummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","date":"2025-02-01","latestMonthEmissions":4.03434676039166,"previousMonthEmissions":3.8404928053944,"monthOverMonthEmissionsChangeRatio":0.05047632291485367,"monthlyEmissionsChangeValue":0.19385395499726},{"dataType":"TopItemsMonthlySummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","date":"2025-03-01","latestMonthEmissions":4.33814596621092,"previousMonthEmissions":4.03434676039166,"monthOverMonthEmissionsChangeRatio":0.07530319624527436,"monthlyEmissionsChangeValue":0.30379920581926}]}' + headers: + cache-control: + - no-cache + content-length: + - '24114' + content-type: + - application/json; charset=utf-8 + date: + - Fri, 16 May 2025 18:29:52 GMT + expires: + - '-1' + mise-correlation-id: + - a4ea0c4b-d891-4ef5-bb3d-de6f10fcad85 + pragma: + - no-cache + request-context: + - appId=cid-v1:1b30ee95-d108-4b28-8df6-b780a66c5364 + set-cookie: + - ARRAffinity=6a905f1fe3bcb60614bcfaadaf811d67162e7d29decc8056d3ac2662076138f6;Path=/;HttpOnly;Secure;Domain=sustcarbon-webapp-prod-wus.azurewebsites.net + - ARRAffinitySameSite=6a905f1fe3bcb60614bcfaadaf811d67162e7d29decc8056d3ac2662076138f6;Path=/;HttpOnly;SameSite=None;Secure;Domain=sustcarbon-webapp-prod-wus.azurewebsites.net + strict-transport-security: + - max-age=31536000; includeSubDomains + vary: + - Accept-Encoding + x-azure-ref: + - 20250516T182953Z-17bc9bb9bf7vtq4nhC1CYScqtg0000000n90000000000fu3 + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-operation-identifier: + - '' + x-ms-providerhub-traffic: + - 'True' + x-msedge-ref: + - 'Ref A: D8EA931BFC9A49F3B7C028494AFDA756 Ref B: MWH011020807025 Ref C: 2025-05-16T18:29:52Z' + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +version: 1 diff --git a/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_top_items_summary_report.yaml b/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_top_items_summary_report.yaml new file mode 100644 index 00000000000..0874f07288b --- /dev/null +++ b/src/carbon/azext_carbon/tests/latest/recordings/test_get_emission_report_top_items_summary_report.yaml @@ -0,0 +1,70 @@ +interactions: +- request: + body: '{"carbonScopeList": ["Scope1", "Scope2", "Scope3"], "dateRange": {"end": + "2025-03-01", "start": "2025-03-01"}, "reportType": "TopItemsSummaryReport", + "subscriptionList": ["1fcfa925-ad8b-443e-afc9-73038125cc86"], "categoryType": + "ResourceType", "topItems": 5}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - carbon get-emission-report + Connection: + - keep-alive + Content-Length: + - '258' + Content-Type: + - application/json + ParameterSetName: + - --subscription-list --date-range --carbon-scope-list --top-items-summary + User-Agent: + - AZURECLI/2.72.0 azsdk-python-core/1.31.0 Python/3.11.9 (Windows-10-10.0.22631-SP0) + method: POST + uri: https://management.azure.com/providers/Microsoft.Carbon/carbonEmissionReports?api-version=2025-04-01 + response: + body: + string: '{"value":[{"dataType":"TopItemsSummaryData","itemName":"microsoft.fabric/capacities","categoryType":"ResourceType","latestMonthEmissions":170.364957551656,"previousMonthEmissions":199.860710018915,"monthOverMonthEmissionsChangeRatio":-0.147581545489696,"monthlyEmissionsChangeValue":-29.4957524672594},{"dataType":"TopItemsSummaryData","itemName":"microsoft.kusto/clusters","categoryType":"ResourceType","latestMonthEmissions":11.0909111385652,"previousMonthEmissions":9.4563412289584,"monthOverMonthEmissionsChangeRatio":0.172854370419842,"monthlyEmissionsChangeValue":1.6345699096068},{"dataType":"TopItemsSummaryData","itemName":"microsoft.synapse/workspaces/bigdatapools","categoryType":"ResourceType","latestMonthEmissions":10.2741922887871,"previousMonthEmissions":10.4031346841103,"monthOverMonthEmissionsChangeRatio":-0.0123945713708978,"monthlyEmissionsChangeValue":-0.128942395323268},{"dataType":"TopItemsSummaryData","itemName":"microsoft.storage/storageaccounts","categoryType":"ResourceType","latestMonthEmissions":5.73549901502806,"previousMonthEmissions":6.60325276568956,"monthOverMonthEmissionsChangeRatio":-0.131413074957594,"monthlyEmissionsChangeValue":-0.867753750661506},{"dataType":"TopItemsSummaryData","itemName":"microsoft.sql/servers/databases","categoryType":"ResourceType","latestMonthEmissions":3.63518373774172,"previousMonthEmissions":3.69563555963608,"monthOverMonthEmissionsChangeRatio":-0.0163576253445068,"monthlyEmissionsChangeValue":-0.0604518218943637},{"dataType":"TopItemsSummaryData","itemName":"Others-Exclude-Top-Items-From-Overall-Summary","categoryType":"ResourceType","latestMonthEmissions":4.33814596621092,"previousMonthEmissions":4.03434676039166,"monthOverMonthEmissionsChangeRatio":0.07530319624527436,"monthlyEmissionsChangeValue":0.30379920581926}]}' + headers: + cache-control: + - no-cache + content-length: + - '1804' + content-type: + - application/json; charset=utf-8 + date: + - Fri, 16 May 2025 18:29:52 GMT + expires: + - '-1' + mise-correlation-id: + - 12d92def-bbee-40b4-a909-30f76f5b3f55 + pragma: + - no-cache + request-context: + - appId=cid-v1:1b30ee95-d108-4b28-8df6-b780a66c5364 + set-cookie: + - ARRAffinity=92cff1672181f3de1ff12b696639b5c8fe7f87b1484ca72975ce446af3251683;Path=/;HttpOnly;Secure;Domain=sustcarbon-webapp-prod-wus.azurewebsites.net + - ARRAffinitySameSite=92cff1672181f3de1ff12b696639b5c8fe7f87b1484ca72975ce446af3251683;Path=/;HttpOnly;SameSite=None;Secure;Domain=sustcarbon-webapp-prod-wus.azurewebsites.net + strict-transport-security: + - max-age=31536000; includeSubDomains + vary: + - Accept-Encoding + x-azure-ref: + - 20250516T182952Z-1794cd57cdb4wj2khC1CO1v0hs00000002r000000000arqu + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-operation-identifier: + - '' + x-ms-providerhub-traffic: + - 'True' + x-msedge-ref: + - 'Ref A: 039EDD5C288C4C86BAB149FEE13ED77F Ref B: MWH011020809031 Ref C: 2025-05-16T18:29:52Z' + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +version: 1 diff --git a/src/carbon/azext_carbon/tests/latest/test_carbon.py b/src/carbon/azext_carbon/tests/latest/test_carbon.py new file mode 100644 index 00000000000..28459466ec7 --- /dev/null +++ b/src/carbon/azext_carbon/tests/latest/test_carbon.py @@ -0,0 +1,120 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +# pylint: disable=line-too-long +# pylint: disable=too-many-lines + +from azure.cli.testsdk import * +class CarbonScenario(ScenarioTest): + def test_get_emission_data_available_date_range(self): + result = self.cmd('az carbon get-emission-data-available-date-range').get_output_in_json() + + # Assertions + self.assertEqual(result['startDate'], '2024-03-01') + self.assertEqual(result['endDate'], '2025-03-01') + + def test_get_emission_report_overall_summary_report(self): + self.kwargs.update({ + 'subscription_id': self.get_subscription_id(), + 'date_range': '{start:2024-03-01,end:2025-03-01}', + 'scope': '[Scope1,Scope2,Scope3]' + }) + result = self.cmd( + 'az carbon get-emission-report --subscription-list [{subscription_id}] --date-range {date_range} --carbon-scope-list {scope} --overall-summary' + ).get_output_in_json() + + # Assertions + self.assertEqual(result['value'][0]['dataType'], 'OverallSummaryData') + self.assertIsNotNone(result['value'][0]['latestMonthEmissions']) + self.assertIsNotNone(result['value'][0]['previousMonthEmissions']) + self.assertIsNotNone(result['value'][0]['monthOverMonthEmissionsChangeRatio']) + self.assertIsNotNone(result['value'][0]['monthlyEmissionsChangeValue']) + + def test_get_emission_report_monthly_summary_report(self): + self.kwargs.update({ + 'subscription_id': self.get_subscription_id(), + 'date_range': '{start:2024-03-01,end:2025-03-01}', + 'scope': '[Scope1,Scope2,Scope3]' + }) + result = self.cmd( + 'az carbon get-emission-report --subscription-list [{subscription_id}] --date-range {date_range} --carbon-scope-list {scope} --monthly-summary' + ).get_output_in_json() + + # Assertions + self.assertEqual(result['value'][0]['dataType'], 'MonthlySummaryData') + self.assertIsNotNone(result['value'][0]['date']) + self.assertIsNotNone(result['value'][0]['carbonIntensity']) + self.assertIsNotNone(result['value'][0]['latestMonthEmissions']) + self.assertIsNotNone(result['value'][0]['previousMonthEmissions']) + self.assertIsNotNone(result['value'][0]['monthOverMonthEmissionsChangeRatio']) + self.assertIsNotNone(result['value'][0]['monthlyEmissionsChangeValue']) + + def test_get_emission_report_item_details_report(self): + self.kwargs.update({ + 'subscription_id': self.get_subscription_id(), + 'date_range': '{start:2025-03-01,end:2025-03-01}', + 'scope': '[Scope1,Scope2,Scope3]', + 'category_type': 'ResourceType', + 'order_by': 'ItemName', + 'page_size': 10, + 'sort_direction': 'Asc' + }) + result = self.cmd( + 'az carbon get-emission-report --subscription-list [{subscription_id}] --date-range {date_range} --carbon-scope-list {scope} --item-details "{{category-type:{category_type},order-by:{order_by},page-size:{page_size},sort-direction:{sort_direction}}}"' + ).get_output_in_json() + + # Assertions + self.assertEqual(result['value'][0]['dataType'], 'ItemDetailsData') + self.assertIsNotNone(result['value'][0]['itemName']) + self.assertIsNotNone(result['value'][0]['categoryType']) + self.assertIsNotNone(result['value'][0]['latestMonthEmissions']) + self.assertIsNotNone(result['value'][0]['previousMonthEmissions']) + self.assertIsNotNone(result['value'][0]['monthOverMonthEmissionsChangeRatio']) + self.assertIsNotNone(result['value'][0]['monthlyEmissionsChangeValue']) + + def test_get_emission_report_top_items_summary_report(self): + self.kwargs.update({ + 'subscription_id': self.get_subscription_id(), + 'date_range': '{start:2025-03-01,end:2025-03-01}', + 'scope': '[Scope1,Scope2,Scope3]', + 'category_type': 'ResourceType', + 'top_items': 5 + }) + result = self.cmd( + 'az carbon get-emission-report --subscription-list [{subscription_id}] --date-range {date_range} --carbon-scope-list {scope} --top-items-summary "{{category-type:{category_type},top-items:{top_items}}}"' + ).get_output_in_json() + + # Assertions + self.assertEqual(result['value'][0]['dataType'], 'TopItemsSummaryData') + self.assertIsNotNone(result['value'][0]['itemName']) + self.assertIsNotNone(result['value'][0]['categoryType']) + self.assertIsNotNone(result['value'][0]['latestMonthEmissions']) + self.assertIsNotNone(result['value'][0]['previousMonthEmissions']) + self.assertIsNotNone(result['value'][0]['monthOverMonthEmissionsChangeRatio']) + self.assertIsNotNone(result['value'][0]['monthlyEmissionsChangeValue']) + + def test_get_emission_report_top_items_monthly_summary_report(self): + self.kwargs.update({ + 'subscription_id': self.get_subscription_id(), + 'date_range': '{start:2024-03-01,end:2025-03-01}', + 'scope': '[Scope1,Scope2,Scope3]', + 'category_type': 'ResourceType', + 'top_items': 5 + }) + result = self.cmd( + 'az carbon get-emission-report --subscription-list {subscription_id} --date-range {date_range} --carbon-scope-list {scope} --top-items-monthly "{{category-type:{category_type},top-items:{top_items}}}"' + ).get_output_in_json() + + # Assertions + self.assertEqual(result['value'][0]['dataType'], 'TopItemsMonthlySummaryData') + self.assertIsNotNone(result['value'][0]['itemName']) + self.assertIsNotNone(result['value'][0]['categoryType']) + self.assertIsNotNone(result['value'][0]['date']) + self.assertIsNotNone(result['value'][0]['latestMonthEmissions']) + self.assertIsNotNone(result['value'][0]['monthOverMonthEmissionsChangeRatio']) + self.assertIsNotNone(result['value'][0]['previousMonthEmissions']) + self.assertIsNotNone(result['value'][0]['monthlyEmissionsChangeValue']) \ No newline at end of file diff --git a/src/carbon/setup.cfg b/src/carbon/setup.cfg new file mode 100644 index 00000000000..2fdd96e5d39 --- /dev/null +++ b/src/carbon/setup.cfg @@ -0,0 +1 @@ +#setup.cfg \ No newline at end of file diff --git a/src/carbon/setup.py b/src/carbon/setup.py new file mode 100644 index 00000000000..c4d47691bf7 --- /dev/null +++ b/src/carbon/setup.py @@ -0,0 +1,49 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# +# Code generated by aaz-dev-tools +# -------------------------------------------------------------------------------------------- + +from codecs import open +from setuptools import setup, find_packages + + +# HISTORY.rst entry. +VERSION = '1.0.0b1' + +# The full list of classifiers is available at +# https://pypi.python.org/pypi?%3Aaction=list_classifiers +CLASSIFIERS = [ + 'Development Status :: 4 - Beta', + 'Intended Audience :: Developers', + 'Intended Audience :: System Administrators', + 'Programming Language :: Python', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'License :: OSI Approved :: MIT License', +] + +DEPENDENCIES = [] + +with open('README.md', 'r', encoding='utf-8') as f: + README = f.read() +with open('HISTORY.rst', 'r', encoding='utf-8') as f: + HISTORY = f.read() + +setup( + name='carbon', + version=VERSION, + description='Microsoft Azure Command-Line Tools Carbon Extension.', + long_description=README + '\n\n' + HISTORY, + license='MIT', + author='Microsoft Corporation', + author_email='azpycli@microsoft.com', + url='https://github.com/Azure/azure-cli-extensions/tree/main/src/carbon', + classifiers=CLASSIFIERS, + packages=find_packages(exclude=["tests"]), + package_data={'azext_carbon': ['azext_metadata.json']}, + install_requires=DEPENDENCIES +) diff --git a/src/service_name.json b/src/service_name.json index d51a2805ab2..fe88c928fa4 100644 --- a/src/service_name.json +++ b/src/service_name.json @@ -934,6 +934,11 @@ "AzureServiceName": "LambdaTest", "URL": "https://learn.microsoft.com/en-us/azure/partner-solutions" }, + { + "Command": "az carbon", + "AzureServiceName": "Carbon Optimization", + "URL": "https://learn.microsoft.com/en-us/azure/carbon-optimization/" + }, { "Command": "az vme", "AzureServiceName": "Azure Arc Kubernetes Version Managed Extensions",