osc-cost 0.8.0

osc-cost helps measuring OUTSCALE infrastructure costs
Documentation
use std::error;

use log::{debug, warn};
use outscale_api::{
    apis::load_balancer_api::read_load_balancers,
    models::{ReadLoadBalancersRequest, ReadLoadBalancersResponse},
};

use crate::{
    core::{load_balancers::LoadBalancer, Resource, Resources},
    VERSION,
};

use super::Input;

pub type LoadbalancerId = String;
const RESOURCE_NAME: &str = "LoadBalancer";

impl Input {
    pub fn fetch_load_balancers(&mut self) -> Result<(), Box<dyn error::Error>> {
        if self.skip_fetch(RESOURCE_NAME) {
            return Ok(());
        }
        let request = ReadLoadBalancersRequest {
            ..Default::default()
        };
        let result: ReadLoadBalancersResponse =
            read_load_balancers(&self.config, Some(request.clone()))?;
        debug!("{:#?}", result);

        let resources = match result.load_balancers {
            None => {
                warn!("warning: no load balancer available");
                return Ok(());
            }
            Some(lbu) => lbu,
        };
        self.load_balancers.clear();
        for lbu in resources {
            let lbu_id = lbu
                .load_balancer_name
                .clone()
                .unwrap_or_else(|| String::from(""));
            self.load_balancers.push(lbu_id);
        }
        warn!("info: fetched {} load balancers", self.load_balancers.len());
        Ok(())
    }

    pub fn fill_resource_load_balancers(&self, resources: &mut Resources) {
        if self.load_balancers.is_empty() && self.need_default_resource {
            resources
                .resources
                .push(Resource::LoadBalancer(LoadBalancer {
                    account_id: self.account_id(),
                    read_date_rfc3339: self.fetch_date.map(|date| date.to_rfc3339()),
                    region: self.region.clone(),
                    ..Default::default()
                }));
        }
        let Some(price_per_hour) =
            self.catalog_entry("TinaOS-LBU", "LBU:Usage", "CreateLoadBalancer")
        else {
            warn!("warning: could not retrieve the catalog for load balancer");
            return;
        };
        for resource_id in &self.load_balancers {
            let core_resource = LoadBalancer {
                osc_cost_version: Some(String::from(VERSION)),
                account_id: self.account_id(),
                read_date_rfc3339: self.fetch_date.map(|date| date.to_rfc3339()),
                region: self.region.clone(),
                resource_id: Some(resource_id.clone()),
                price_per_hour: Some(price_per_hour),
                price_per_month: None,
            };
            resources
                .resources
                .push(Resource::LoadBalancer(core_resource));
        }
    }
}