Skip to content

Fix float() error when annualSavingsAmount is None #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 9, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 52 additions & 26 deletions src/plugin/manager/advisor/recommendation_cost_manager.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import logging
from typing import Union

from spaceone.inventory.plugin.collector.lib import *

from plugin.conf.cloud_service_conf import ICON_URL
from plugin.connector.advisor.advisor_connector import AdvisorConnector
from plugin.connector.subscriptions.subscriptions_connector import SubscriptionsConnector
from plugin.connector.subscriptions.subscriptions_connector import (
SubscriptionsConnector,
)
from plugin.manager.base import AzureBaseManager

_LOGGER = logging.getLogger("spaceone")
Expand All @@ -22,36 +25,56 @@ def create_cloud_service(self, options: dict, secret_data: dict, schema: str):
advisor_conn = AdvisorConnector(secret_data=secret_data)
subscription_conn = SubscriptionsConnector(secret_data=secret_data)

subscription_obj = subscription_conn.get_subscription(secret_data["subscription_id"])
subscription_obj = subscription_conn.get_subscription(
secret_data["subscription_id"]
)
subscription_info = self.convert_nested_dictionary(subscription_obj)
recommendation_filter = f"Category eq '{self.cloud_service_type}'"
recommendations = advisor_conn.list_recommendations(recommendation_filter=recommendation_filter)
recommendations = advisor_conn.list_recommendations(
recommendation_filter=recommendation_filter
)

for recommendation in recommendations:
try:
recommendation_info = self.convert_nested_dictionary(recommendation)
recommendation_info.update({
"tenant_id": subscription_info.get("tenant_id"),
"subscription_id": subscription_info.get("subscription_id"),
"subscription_name": subscription_info.get("display_name"),
})
recommendation_info.update(
{
"tenant_id": subscription_info.get("tenant_id"),
"subscription_id": subscription_info.get("subscription_id"),
"subscription_name": subscription_info.get("display_name"),
}
)

category = recommendation_info.get("category")
self.cloud_service_type = category

extended_properties = recommendation_info.get("extended_properties", {}) or {}
if extended_properties:
potential_yearly_savings_based_on_retail_pricing = extended_properties.get("annualSavingsAmount")
recommendation_info["potential_yearly_savings_based_on_retail_pricing_display"] = float(
potential_yearly_savings_based_on_retail_pricing)

if recommendation_info.get("impacted_field") == "Microsoft.Subscriptions/subscriptions":
recommendation_info["impacted_value_display"] = recommendation_info.get("subscription_name")
extended_properties = (
recommendation_info.get("extended_properties", {}) or {}
)
if (
extended_properties
and extended_properties.get("annualSavingsAmount") is not None
):
recommendation_info[
"potential_yearly_savings_based_on_retail_pricing_display"
] = float(extended_properties["annualSavingsAmount"])

if (
recommendation_info.get("impacted_field")
== "Microsoft.Subscriptions/subscriptions"
):
recommendation_info["impacted_value_display"] = (
recommendation_info.get("subscription_name")
)
else:
recommendation_info["impacted_value_display"] = recommendation_info.get("impacted_value")
recommendation_info["impacted_value_display"] = (
recommendation_info.get("impacted_value")
)

short_description = recommendation_info.get("short_description")
extended_properties = recommendation_info.get("extended_properties", {}) or {}
extended_properties = (
recommendation_info.get("extended_properties", {}) or {}
)

cloud_services.append(
make_cloud_service(
Expand All @@ -60,21 +83,24 @@ def create_cloud_service(self, options: dict, secret_data: dict, schema: str):
cloud_service_type=self.cloud_service_type,
cloud_service_group=self.cloud_service_group,
provider=self.provider,
region_code=self._get_region_from_extended_properties(extended_properties),
region_code=self._get_region_from_extended_properties(
extended_properties
),
data=recommendation_info,
reference=self.make_reference(recommendation_info.get("id"))
reference=self.make_reference(recommendation_info.get("id")),
)
)
except Exception as e:
_LOGGER.error(f"[create_cloud_service] Error {self.service} {e}", exc_info=True)
_LOGGER.error(
f"[create_cloud_service] Error {self.service} {e}", exc_info=True
)
error_responses.append(
make_error_response(
error=e,
provider=self.provider,
cloud_service_group=self.cloud_service_group,
cloud_service_type=self.cloud_service_type,
)

)

return cloud_services, error_responses
Expand All @@ -89,17 +115,17 @@ def create_cloud_service_type(self):
is_primary=False,
is_major=False,
labels=["Management"],
tags={
"spaceone:icon": f"{ICON_URL}/azure-advisor.svg"
}
tags={"spaceone:icon": f"{ICON_URL}/azure-advisor.svg"},
)

@staticmethod
def _get_name_from_short_description(short_description: dict) -> str:
return short_description["problem"]

@staticmethod
def _get_region_from_extended_properties(extended_properties: dict) -> Union[str, None]:
def _get_region_from_extended_properties(
extended_properties: dict,
) -> Union[str, None]:
region = None
if "regionId" in extended_properties:
region = extended_properties.get("regionId", None)
Expand Down
Loading