def check_owed_order_resources_and_notify(self): #noqa """Check order-billing resources and notify related accounts Send sms/email notifications for each has-owed or will-owed order. """ try: accounts = self._assigned_accounts() except Exception: LOG.exception("Fail to get assigned accounts") accounts = [] LOG.warn("[%s] Notifying owed accounts, assigned accounts number: %s", self.member_id, len(accounts)) bill_methods = ['month', 'year'] for account in accounts: try: if not isinstance(account, dict): account = account.as_dict() if account['level'] == 9: continue contact = keystone.get_uos_user(account['user_id']) country_code = contact.get("country_code") or "86" language = "en_US" if country_code != '86' else "zh_CN" account['reserved_days'] = utils.cal_reserved_days( account['level']) orders = list( self.gclient.get_active_orders(user_id=account['user_id'], bill_methods=bill_methods)) for order in orders: # check if the resource exists resource = self.RESOURCE_GET_MAP[order['type']]( order['resource_id'], region_name=order['region_id']) if not resource: # warning that the resource not exists LOG.warn( "[%s] The resource(%s|%s) has been " "deleted", self.member_id, order['type'], order['resource_id']) continue order_d = {} order_d['order_id'] = order['order_id'] order_d['region_id'] = order['region_id'] order_d['resource_id'] = order['resource_id'] order_d['resource_name'] = order['resource_name'] order_d['type'] = order['type'] order_d['owed'] = order['owed'] if isinstance(order['date_time'], basestring): order['date_time'] = timeutils.parse_strtime( order['date_time'], fmt=ISO8601_UTC_TIME_FORMAT) if isinstance(order['cron_time'], basestring): order['cron_time'] = timeutils.parse_strtime( order['cron_time'], fmt=ISO8601_UTC_TIME_FORMAT) # if order is owed, reserved_days represent how long resource will be reserved; # if not, reserved_days repesent how long resource will be expired now = datetime.datetime.utcnow() if order['owed']: reserved_days = (order['date_time'] - now).days else: reserved_days = (order['cron_time'] - now).days if reserved_days < 0: LOG.warn( "[%s] The order %s reserved_days is " "less than 0", self.member_id, order['order_id']) reserved_days = 0 order_d['reserved_days'] = reserved_days order_d['date_time'] = timeutils.strtime( order['date_time'], fmt=ISO8601_UTC_TIME_FORMAT) order_d['cron_time'] = timeutils.strtime( order['cron_time'], fmt=ISO8601_UTC_TIME_FORMAT) is_notify_will_owed = (order_d['reserved_days'] <= cfg.CONF.checker.days_to_owe) if order_d['owed'] or (not order_d['owed'] and is_notify_will_owed): self.notifier.notify_order_billing_owed( self.ctxt, account, contact, order_d, language=language) except Exception: LOG.exception( "Some exceptions occurred when checking owed " "account: %s", account['user_id'])
def check_owed_order_resources_and_notify(self): #noqa """Check order-billing resources and notify related accounts Send sms/email notifications for each has-owed or will-owed order. """ try: accounts = self._assigned_accounts() except Exception: LOG.exception("Fail to get assigned accounts") accounts = [] LOG.warn("[%s] Notifying owed accounts, assigned accounts number: %s", self.member_id, len(accounts)) bill_methods = ['month', 'year'] for account in accounts: try: if not isinstance(account, dict): account = account.as_dict() if account['level'] == 9: continue contact = keystone.get_uos_user(account['user_id']) country_code = contact.get("country_code") or "86" language = "en_US" if country_code != '86' else "zh_CN" account['reserved_days'] = utils.cal_reserved_days(account['level']) orders = list( self.gclient.get_active_orders( user_id=account['user_id'], bill_methods=bill_methods) ) for order in orders: # check if the resource exists resource = self.RESOURCE_GET_MAP[order['type']]( order['resource_id'], region_name=order['region_id']) if not resource: # warning that the resource not exists LOG.warn("[%s] The resource(%s|%s) has been " "deleted", self.member_id, order['type'], order['resource_id']) continue order_d = {} order_d['order_id'] = order['order_id'] order_d['region_id'] = order['region_id'] order_d['resource_id'] = order['resource_id'] order_d['resource_name'] = order['resource_name'] order_d['type'] = order['type'] order_d['owed'] = order['owed'] if isinstance(order['date_time'], basestring): order['date_time'] = timeutils.parse_strtime( order['date_time'], fmt=ISO8601_UTC_TIME_FORMAT) if isinstance(order['cron_time'], basestring): order['cron_time'] = timeutils.parse_strtime( order['cron_time'], fmt=ISO8601_UTC_TIME_FORMAT) # if order is owed, reserved_days represent how long resource will be reserved; # if not, reserved_days repesent how long resource will be expired now = datetime.datetime.utcnow() if order['owed']: reserved_days = (order['date_time'] - now).days else: reserved_days = (order['cron_time'] - now).days if reserved_days < 0: LOG.warn("[%s] The order %s reserved_days is " "less than 0", self.member_id, order['order_id']) reserved_days = 0 order_d['reserved_days'] = reserved_days order_d['date_time'] = timeutils.strtime( order['date_time'], fmt=ISO8601_UTC_TIME_FORMAT) order_d['cron_time'] = timeutils.strtime( order['cron_time'], fmt=ISO8601_UTC_TIME_FORMAT) is_notify_will_owed = (order_d['reserved_days'] <= cfg.CONF.checker.days_to_owe) if order_d['owed'] or (not order_d['owed'] and is_notify_will_owed): self.notifier.notify_order_billing_owed(self.ctxt, account, contact, order_d, language=language) except Exception: LOG.exception("Some exceptions occurred when checking owed " "account: %s", account['user_id'])
def check_owed_hour_resources_and_notify(self): # noqa """Check owed hour-billing resources and notify them Get owed accounts, send them sms/email notifications. """ try: accounts = self._assigned_accounts() except Exception: LOG.exception("Fail to get assigned accounts") accounts = [] LOG.warn("[%s] Notifying owed accounts, assigned accounts number: %s", self.member_id, len(accounts)) bill_methods = [ 'hour', ] for account in accounts: try: if not isinstance(account, dict): account = account.as_dict() if account['level'] == 9: continue if account['owed']: orders = list( self.gclient.get_active_orders( user_id=account['user_id'], owed=True, bill_methods=bill_methods)) if not orders: continue contact = keystone.get_user(account['user_id']).to_dict() _projects = self.gclient.get_projects( user_id=account['user_id'], type='simple') orders_dict = {} for project in _projects: orders_dict[project['project_id']] = [] for order in orders: # check if the resource exists resource = self.RESOURCE_GET_MAP[order['type']]( order['resource_id'], region_name=order['region_id']) if not resource: # NOTE(chengkun): just warning if the resource not exists LOG.warn( "[%s] The resource(%s|%s) has been " "deleted", self.member_id, order['type'], order['resource_id']) continue order_d = {} order_d['order_id'] = order['order_id'] order_d['region_id'] = order['region_id'] order_d['resource_id'] = order['resource_id'] order_d['resource_name'] = order['resource_name'] order_d['type'] = order['type'] if isinstance(order['date_time'], basestring): order['date_time'] = timeutils.parse_strtime( order['date_time'], fmt=ISO8601_UTC_TIME_FORMAT) now = datetime.datetime.utcnow() reserved_days = (order['date_time'] - now).days if reserved_days < 0: LOG.warn( "[%s] The order %s reserved_days is " "less than 0", self.member_id, order['order_id']) reserved_days = 0 order_d['reserved_days'] = reserved_days order_d['date_time'] = timeutils.strtime( order['date_time'], fmt=ISO8601_UTC_TIME_FORMAT) orders_dict[order['project_id']].append(order_d) projects = [] for project in _projects: if orders_dict[project['project_id']]: adict = {} adict['project_id'] = project['project_id'] adict['project_name'] = project['project_name'] adict['orders'] = ( orders_dict[project['project_id']]) projects.append(adict) if not projects: continue reserved_days = utils.cal_reserved_days(account['level']) account['reserved_days'] = reserved_days country_code = contact.get("country_code") or "86" language = "en_US" if country_code != '86' else "zh_CN" self.notifier.notify_has_owed(self.ctxt, account, contact, projects, language=language) else: orders = self.gclient.get_active_orders( user_id=account['user_id'], bill_methods=bill_methods) if not orders: continue _projects = self.gclient.get_projects( user_id=account['user_id'], type='simple') estimation = {} for project in _projects: estimation[project['project_id']] = 0 price_per_hour = 0 for order in orders: # check if the resource exists resource = self.RESOURCE_GET_MAP[order['type']]( order['resource_id'], region_name=order['region_id']) if not resource: # just warning the resource not exists LOG.warn( "[%s] The resource(%s|%s) may has been " "deleted", self.member_id, order['type'], order['resource_id']) continue price_per_hour += utils._quantize_decimal( order['unit_price']) estimation[order['project_id']] += \ utils._quantize_decimal(order['unit_price']) price_per_day = price_per_hour * 24 account_balance = utils._quantize_decimal( account['balance']) if price_per_day == 0: continue days_to_owe_d = float(account_balance / price_per_day) days_to_owe = round(days_to_owe_d) if days_to_owe > cfg.CONF.checker.days_to_owe: continue # caculate projects projects = [] for project in _projects: adict = {} adict['project_id'] = project['project_id'] adict['project_name'] = project['project_name'] adict['estimation'] = str( estimation[project['project_id']] * 24) projects.append(adict) if not projects: continue contact = keystone.get_uos_user(account['user_id']) country_code = contact.get("country_code") or "86" language = "en_US" if country_code != '86' else "zh_CN" self.notifier.notify_before_owed(self.ctxt, account, contact, projects, str(price_per_day), days_to_owe, language=language) except Exception: LOG.exception( "Some exceptions occurred when checking owed " "account: %s", account['user_id'])
def check_owed_hour_resources_and_notify(self): # noqa """Check owed hour-billing resources and notify them Get owed accounts, send them sms/email notifications. """ try: accounts = self._assigned_accounts() except Exception: LOG.exception("Fail to get assigned accounts") accounts = [] LOG.warn("[%s] Notifying owed accounts, assigned accounts number: %s", self.member_id, len(accounts)) bill_methods=['hour',] for account in accounts: try: if not isinstance(account, dict): account = account.as_dict() if account['level'] == 9: continue if account['owed']: orders = list( self.gclient.get_active_orders( user_id=account['user_id'], owed=True, bill_methods=bill_methods) ) if not orders: continue contact = keystone.get_user(account['user_id']).to_dict() _projects = self.gclient.get_projects( user_id=account['user_id'], type='simple') orders_dict = {} for project in _projects: orders_dict[project['project_id']] = [] for order in orders: # check if the resource exists resource = self.RESOURCE_GET_MAP[order['type']]( order['resource_id'], region_name=order['region_id']) if not resource: # NOTE(chengkun): just warning if the resource not exists LOG.warn("[%s] The resource(%s|%s) has been " "deleted", self.member_id, order['type'], order['resource_id']) continue order_d = {} order_d['order_id'] = order['order_id'] order_d['region_id'] = order['region_id'] order_d['resource_id'] = order['resource_id'] order_d['resource_name'] = order['resource_name'] order_d['type'] = order['type'] if isinstance(order['date_time'], basestring): order['date_time'] = timeutils.parse_strtime( order['date_time'], fmt=ISO8601_UTC_TIME_FORMAT) now = datetime.datetime.utcnow() reserved_days = (order['date_time'] - now).days if reserved_days < 0: LOG.warn("[%s] The order %s reserved_days is " "less than 0", self.member_id, order['order_id']) reserved_days = 0 order_d['reserved_days'] = reserved_days order_d['date_time'] = timeutils.strtime( order['date_time'], fmt=ISO8601_UTC_TIME_FORMAT) orders_dict[order['project_id']].append(order_d) projects = [] for project in _projects: if orders_dict[project['project_id']]: adict = {} adict['project_id'] = project['project_id'] adict['project_name'] = project['project_name'] adict['orders'] = (orders_dict[ project['project_id']]) projects.append(adict) if not projects: continue reserved_days = utils.cal_reserved_days(account['level']) account['reserved_days'] = reserved_days country_code = contact.get("country_code") or "86" language = "en_US" if country_code != '86' else "zh_CN" self.notifier.notify_has_owed(self.ctxt, account, contact, projects, language=language) else: orders = self.gclient.get_active_orders( user_id=account['user_id'], bill_methods=bill_methods) if not orders: continue _projects = self.gclient.get_projects( user_id=account['user_id'], type='simple') estimation = {} for project in _projects: estimation[project['project_id']] = 0 price_per_hour = 0 for order in orders: # check if the resource exists resource = self.RESOURCE_GET_MAP[order['type']]( order['resource_id'], region_name=order['region_id']) if not resource: # just warning the resource not exists LOG.warn("[%s] The resource(%s|%s) may has been " "deleted", self.member_id, order['type'], order['resource_id']) continue price_per_hour += utils._quantize_decimal( order['unit_price']) estimation[order['project_id']] += \ utils._quantize_decimal(order['unit_price']) price_per_day = price_per_hour * 24 account_balance = utils._quantize_decimal( account['balance']) if price_per_day == 0: continue days_to_owe_d = float(account_balance / price_per_day) days_to_owe = round(days_to_owe_d) if days_to_owe > cfg.CONF.checker.days_to_owe: continue # caculate projects projects = [] for project in _projects: adict = {} adict['project_id'] = project['project_id'] adict['project_name'] = project['project_name'] adict['estimation'] = str( estimation[project['project_id']] * 24) projects.append(adict) if not projects: continue contact = keystone.get_uos_user(account['user_id']) country_code = contact.get("country_code") or "86" language = "en_US" if country_code != '86' else "zh_CN" self.notifier.notify_before_owed(self.ctxt, account, contact, projects, str(price_per_day), days_to_owe, language=language) except Exception: LOG.exception("Some exceptions occurred when checking owed " "account: %s", account['user_id'])