def _check_resource_to_order(self, resource, resource_to_order, bad_resources, try_to_fix): try: order = resource_to_order[resource.id] except KeyError: # Situation 1: There may exist resources that have no orders # NOTE(suo): The resource billed by month/year may also has no # order, but for now, we couldn't know which billing type it is # only from the GET resource method, on this occasion, we take # this resource as the hourly billing type, then create the order # in auto-fix process if resource.status == const.STATE_ERROR: bad_resources.append(resource) return if not resource.is_bill: return try_to_fix['1'].append(resource) else: # Situation 2: There may exist resource whose status doesn't match # with its order's if resource.status == const.STATE_ERROR: bad_resources.append(resource) elif order['unit'] in ['month', 'year']: # if the order is billed by month or year, we don't check # it for now, just pass, and set it to checked later pass elif (resource.resource_type == const.RESOURCE_LISTENER and resource.admin_state != order['status']): # for loadbalancer listener action_time = utils.format_datetime(timeutils.strtime()) try_to_fix['2'].append( Situation2Item(order['order_id'], resource.resource_type, action_time, resource.admin_state, resource.project_id)) elif (resource.resource_type != const.RESOURCE_LISTENER and resource.status != order['status']): action_time = utils.format_datetime(timeutils.strtime()) try_to_fix['2'].append( Situation2Item(order['order_id'], resource.resource_type, action_time, resource.status, resource.project_id)) # Situation 3: Resource's order has been created, but its bill not # be created by master elif (not order['cron_time'] and order['status'] != const.STATE_STOPPED): try_to_fix['3'].append( Situation3Item(order['order_id'], resource.created_at, resource.project_id)) # Situation 5: The order's unit_price is different from the # resource's actual price else: unit_price = ( self.RESOURCE_CREATE_MAP[resource.resource_type].\ get_unit_price(resource, 'hour')) order_unit_price = utils._quantize_decimal(order['unit_price']) if unit_price is not None and unit_price != order_unit_price: try_to_fix['5'].append( Situation5Item(order['order_id'], resource, unit_price, resource.project_id)) resource_to_order[resource.id]['checked'] = True
def load_hourly_cron_jobs(self): orders = self._get_cron_orders(bill_methods=['hour'], region_id=cfg.CONF.region_name) for order in orders: if not order['cron_time']: continue elif isinstance(order['cron_time'], basestring): cron_time = timeutils.parse_strtime( order['cron_time'], fmt=ISO8601_UTC_TIME_FORMAT) else: cron_time = order['cron_time'] # create cron job danger_time = (datetime.datetime.utcnow() + datetime.timedelta(seconds=30)) if cron_time > danger_time: self._create_cron_job(order['order_id'], start_date=cron_time) else: LOG.warning("The order(%s) is in danger time after master " "started", order['order_id']) while cron_time <= danger_time: cron_time += datetime.timedelta(hours=1) cron_time -= datetime.timedelta(hours=1) action_time = utils.format_datetime( timeutils.strtime(cron_time)) self._create_bill(self.ctxt, order['order_id'], action_time, "System Adjust") self.locks[order['order_id']] = gthreading.Lock()
def load_hourly_cron_jobs(self): orders = self._get_cron_orders(bill_methods=['hour'], region_id=cfg.CONF.region_name) for order in orders: if not order['cron_time']: continue elif isinstance(order['cron_time'], basestring): cron_time = timeutils.parse_strtime( order['cron_time'], fmt=ISO8601_UTC_TIME_FORMAT) else: cron_time = order['cron_time'] # create cron job danger_time = (datetime.datetime.utcnow() + datetime.timedelta(seconds=30)) if cron_time > danger_time: self._create_cron_job(order['order_id'], start_date=cron_time) else: LOG.warning( "The order(%s) is in danger time after master " "started", order['order_id']) while cron_time <= danger_time: cron_time += datetime.timedelta(hours=1) cron_time -= datetime.timedelta(hours=1) action_time = utils.format_datetime( timeutils.strtime(cron_time)) self._create_bill(self.ctxt, order['order_id'], action_time, "System Adjust") self.locks[order['order_id']] = gthreading.Lock()
def listener_list(project_id, region_name=None, project_name=None): client = get_neutronclient(region_name) if project_id: listeners = client.list_listeners( tenant_id=project_id).get('listeners') else: listeners = client.list_listeners().get('listeners') formatted_listeners = [] for listener in listeners: status = utils.transform_status(listener['status']) admin_state = (const.STATE_RUNNING if listener['admin_state_up'] else const.STATE_STOPPED) created_at = utils.format_datetime( listener.get('created_at', timeutils.strtime())) formatted_listeners.append( Listener(id=listener['id'], name=listener['name'], admin_state_up=listener['admin_state_up'], admin_state=admin_state, connection_limit=listener['connection_limit'], project_id=listener['tenant_id'], project_name=project_name, resource_type=const.RESOURCE_LISTENER, status=status, original_status=listener['status'], created_at=created_at)) return formatted_listeners
def snapshot_list(project_id, region_name=None, detailed=True, project_name=None): """To see all snapshots in the cloud as admin """ c_client = get_cinderclient(region_name) search_opts = {'all_tenants': 1, 'project_id': project_id} if c_client is None: return [] snapshots = c_client.volume_snapshots.list(detailed, search_opts=search_opts) formatted_snap = [] for sp in snapshots: created_at = utils.format_datetime(sp.created_at) status = utils.transform_status(sp.status) formatted_snap.append( Snapshot(id=sp.id, name=sp.display_name, size=sp.size, status=status, original_status=sp.status, resource_type=const.RESOURCE_SNAPSHOT, user_id=None, project_id=project_id, project_name=project_name, created_at=created_at, volume_id=sp.volume_id)) return formatted_snap
def floatingipset_list(project_id, region_name=None, project_name=None): client = get_neutronclient(region_name) if project_id: _fipsets = client.list_floatingipsets(tenant_id=project_id).get("floatingipsets") fipsets = [fip for fip in _fipsets if fip["tenant_id"] == project_id] else: fipsets = client.list_floatingipsets().get("floatingipsets") formatted_fipsets = [] for fipset in fipsets: created_at = utils.format_datetime(fipset["created_at"]) status = utils.transform_status(fipset["status"]) formatted_fipsets.append( FloatingIpSet( id=fipset["id"], name=fipset["uos:name"], size=fipset["rate_limit"], providers=fipset["uos:service_provider"], project_id=fipset["tenant_id"], project_name=project_name, resource_type=const.RESOURCE_FLOATINGIPSET, status=status, original_status=fipset["status"], created_at=created_at, ) ) return formatted_fipsets
def listener_list(project_id, region_name=None, project_name=None): client = get_neutronclient(region_name) if project_id: listeners = client.list_listeners(tenant_id=project_id).get("listeners") else: listeners = client.list_listeners().get("listeners") formatted_listeners = [] for listener in listeners: status = utils.transform_status(listener["status"]) admin_state = const.STATE_RUNNING if listener["admin_state_up"] else const.STATE_STOPPED created_at = utils.format_datetime(listener.get("created_at", timeutils.strtime())) formatted_listeners.append( Listener( id=listener["id"], name=listener["name"], admin_state_up=listener["admin_state_up"], admin_state=admin_state, connection_limit=listener["connection_limit"], project_id=listener["tenant_id"], project_name=project_name, resource_type=const.RESOURCE_LISTENER, status=status, original_status=listener["status"], created_at=created_at, ) ) return formatted_listeners
def volume_list(project_id, region_name=None, detailed=True, project_name=None): """To see all volumes in the cloud as admin. """ c_client = get_cinderclient(region_name) search_opts = {'all_tenants': 1, 'project_id': project_id} if c_client is None: return [] volumes = c_client.volumes.list(detailed, search_opts=search_opts) formatted_volumes = [] for volume in volumes: created_at = utils.format_datetime(volume.created_at) status = utils.transform_status(volume.status) formatted_volumes.append( Volume(id=volume.id, name=volume.display_name, size=volume.size, status=status, type=volume.volume_type, original_status=volume.status, resource_type=const.RESOURCE_VOLUME, user_id=None, project_id=project_id, project_name=project_name, attachments=volume.attachments, created_at=created_at)) return formatted_volumes
def to_message(self): msg = { "event_type": "router.create.end.again", "payload": {"router": {"id": self.id, "name": self.name, "tenant_id": self.project_id}}, "timestamp": utils.format_datetime(timeutils.strtime()), } return msg
def floatingip_list(project_id, region_name=None, project_name=None): client = get_neutronclient(region_name) if project_id: fips = client.list_floatingips(tenant_id=project_id).get('floatingips') else: fips = client.list_floatingips().get('floatingips') formatted_fips = [] for fip in fips: created_at = utils.format_datetime(fip['created_at']) status = utils.transform_status(fip['status']) is_bill = False if fip.get('floatingipset_id') else True formatted_fips.append( FloatingIp(id=fip['id'], name=fip['uos:name'], is_bill=is_bill, size=fip['rate_limit'], providers=fip['uos:service_provider'], project_id=fip['tenant_id'], project_name=project_name, resource_type=const.RESOURCE_FLOATINGIP, status=status, original_status=fip['status'], created_at=created_at)) return formatted_fips
def server_list(project_id, region_name=None, detailed=True, project_name=None): search_opts = {'all_tenants': 1, 'project_id': project_id} servers = get_novaclient(region_name).servers.list(detailed, search_opts) formatted_servers = [] for server in servers: flavor = flavor_get(region_name, server.flavor['id']) image = image_get(region_name, server.image['id']) created_at = utils.format_datetime(server.created) status = utils.transform_status(server.status) formatted_servers.append(Server(id=server.id, name=server.name, flavor_name=flavor.name, flavor_id=flavor.id, disk_gb=getattr(image, "OS-EXT-IMG-SIZE:size") / (1024 * 1024 * 1024), image_name=image.name, image_id=image.id, status=status, original_status=server.status, resource_type=const.RESOURCE_INSTANCE, user_id=server.user_id, project_id=server.tenant_id, project_name=project_name, created_at=created_at)) return formatted_servers
def volume_list(project_id, region_name=None, detailed=True, project_name=None): """To see all volumes in the cloud as admin. """ c_client = get_cinderclient(region_name) search_opts = {'all_tenants': 1, 'project_id': project_id} if c_client is None: return [] volumes = c_client.volumes.list(detailed, search_opts=search_opts) formatted_volumes = [] for volume in volumes: created_at = utils.format_datetime(volume.created_at) status = utils.transform_status(volume.status) formatted_volumes.append(Volume(id=volume.id, name=volume.display_name, size=volume.size, status=status, type=volume.volume_type, original_status=volume.status, resource_type=const.RESOURCE_VOLUME, user_id = None, project_id = project_id, project_name=project_name, attachments=volume.attachments, created_at=created_at)) return formatted_volumes
def snapshot_list(project_id, region_name=None, detailed=True, project_name=None): """To see all snapshots in the cloud as admin """ c_client = get_cinderclient(region_name) search_opts = {'all_tenants': 1, 'project_id': project_id} if c_client is None: return [] snapshots = c_client.volume_snapshots.list(detailed, search_opts=search_opts) formatted_snap = [] for sp in snapshots: created_at = utils.format_datetime(sp.created_at) status = utils.transform_status(sp.status) formatted_snap.append(Snapshot(id=sp.id, name=sp.display_name, size=sp.size, status=status, original_status=sp.status, resource_type=const.RESOURCE_SNAPSHOT, user_id=None, project_id=project_id, project_name=project_name, created_at=created_at, volume_id=sp.volume_id)) return formatted_snap
def restore_resource(self, data): action_time = \ gringutils.format_datetime(timeutils.strtime(timeutils.utcnow())) remarks = '%s Has Been Restored' % data.resource_type.capitalize() self.master_api.resource_restore(request.context, self._id, action_time, remarks)
def floatingipset_list(project_id, region_name=None, project_name=None): client = get_neutronclient(region_name) if project_id: _fipsets = client.list_floatingipsets( tenant_id=project_id).get('floatingipsets') fipsets = [fip for fip in _fipsets if fip['tenant_id'] == project_id] else: fipsets = client.list_floatingipsets().get('floatingipsets') formatted_fipsets = [] for fipset in fipsets: created_at = utils.format_datetime(fipset['created_at']) status = utils.transform_status(fipset['status']) formatted_fipsets.append( FloatingIpSet(id=fipset['id'], name=fipset['uos:name'], size=fipset['rate_limit'], providers=fipset['uos:service_provider'], project_id=fipset['tenant_id'], project_name=project_name, resource_type=const.RESOURCE_FLOATINGIPSET, status=status, original_status=fipset['status'], created_at=created_at)) return formatted_fipsets
def delete_resource(self, data): """Update the order when delete the resource""" action_time = \ gringutils.format_datetime(timeutils.strtime(timeutils.utcnow())) remarks = '%s Has Been Deleted' % data.resource_type.capitalize() self.master_api.resource_deleted(request.context, self._id, action_time, remarks)
def stop_resource(self, data): action_time = \ gringutils.format_datetime(timeutils.strtime(timeutils.utcnow())) if data.resource_type == 'instance': self.master_api.instance_stopped(request.context, self._id, action_time) else: remarks = '%s Has Been Stopped' % data.resource_type.capitalize() self.master_api.resource_stopped(request.context, self._id, action_time, remarks)
def _check_order_to_resource(self, resource_id, order, try_to_fix): # if the order is billed by month or year, we don't check it if order['unit'] in ['month', 'year']: LOG.warn("The monthly/yearly billing resource %s has been " "deleted, the order is %s, please check it manually", resource_id, order['order_id']) else: # Situation 4: The resource of the order has been deleted deleted_at = utils.format_datetime(timeutils.strtime()) try_to_fix['4'].append(Situation4Item(order['order_id'], deleted_at, order['project_id']))
def to_message(self): msg = { 'event_type': 'image.activate.again', 'payload': { 'id': self.id, 'name': self.name, 'size': self.size, 'owner': self.project_id, }, 'timestamp': utils.format_datetime(timeutils.strtime()) } return msg
def to_message(self): msg = { "event_type": "alarm.creation.again", "payload": { "alarm_id": self.id, "detail": {"name": self.name}, "user_id": self.user_id, "project_id": self.project_id, }, "timestamp": utils.format_datetime(timeutils.strtime()), } return msg
def to_message(self): msg = { 'event_type': 'snapshot.create.end.again', 'payload': { 'snapshot_id': self.id, 'display_name': self.name, 'volume_size': self.size, 'user_id': self.user_id, 'tenant_id': self.project_id }, 'timestamp': utils.format_datetime(timeutils.strtime()) } return msg
def to_message(self): msg = { 'event_type': 'router.create.end.again', 'payload': { 'router': { 'id': self.id, 'name': self.name, 'tenant_id': self.project_id } }, 'timestamp': utils.format_datetime(timeutils.strtime()) } return msg
def to_message(self): msg = { 'event_type': 'alarm.creation.again', 'payload': { 'alarm_id': self.id, 'detail': { 'name': self.name, }, 'user_id': self.user_id, 'project_id': self.project_id }, 'timestamp': utils.format_datetime(timeutils.strtime()) } return msg
def to_message(self): msg = { 'event_type': 'listener.create.end', 'payload': { 'listener': { 'id': self.id, 'name': self.name, 'admin_state_up': self.admin_state_up, 'connection_limit': self.connection_limit, 'tenant_id': self.project_id } }, 'timestamp': utils.format_datetime(timeutils.strtime()) } return msg
def to_message(self): msg = { 'event_type': 'floatingipset.create.end.again', 'payload': { 'floatingipset': { 'id': self.id, 'uos:name': self.name, 'uos:service_provider': self.providers, 'rate_limit': self.size, 'tenant_id': self.project_id } }, 'timestamp': utils.format_datetime(timeutils.strtime()) } return msg
def to_message(self): msg = { "event_type": "floatingipset.create.end.again", "payload": { "floatingipset": { "id": self.id, "uos:name": self.name, "uos:service_provider": self.providers, "rate_limit": self.size, "tenant_id": self.project_id, } }, "timestamp": utils.format_datetime(timeutils.strtime()), } return msg
def to_message(self): msg = { "event_type": "listener.create.end", "payload": { "listener": { "id": self.id, "name": self.name, "admin_state_up": self.admin_state_up, "connection_limit": self.connection_limit, "tenant_id": self.project_id, } }, "timestamp": utils.format_datetime(timeutils.strtime()), } return msg
def alarm_list(project_id, region_name=None, project_name=None): alarms = get_cmclient(region_name).alarms.list(q=[{'field': 'project_id', 'value': project_id}]) formatted_alarms = [] for alarm in alarms: created_at = utils.format_datetime(alarm.created_at) status = utils.transform_status(str(alarm.enabled)) formatted_alarms.append(Alarm(id=alarm.alarm_id, name=alarm.name, status=status, original_status=str(alarm.enabled), resource_type=const.RESOURCE_ALARM, user_id=alarm.user_id, project_id=project_id, project_name=project_name, created_at=created_at)) return formatted_alarms
def image_list(project_id, region_name=None, project_name=None): filters = {'owner': project_id} images = get_glanceclient(region_name).images.list(filters=filters) formatted_images = [] for image in images: created_at = utils.format_datetime(image.created_at) status = utils.transform_status(image.status) formatted_images.append(Image(id=image.id, name=getattr(image, 'name', None), size=getattr(image, 'size', 0), status=status, original_status=image.status, resource_type=const.RESOURCE_IMAGE, project_id=project_id, project_name=project_name, created_at=created_at)) return formatted_images
def to_message(self): msg = { 'event_type': 'compute.instance.create.end.again', 'payload': { 'instance_type': self.flavor_name, 'disk_gb': self.disk_gb, 'instance_id': self.id, 'display_name': self.name, 'user_id': self.user_id, 'tenant_id': self.project_id, 'image_name': self.image_name, 'image_meta': { 'base_image_ref': self.image_id } }, 'timestamp': utils.format_datetime(timeutils.strtime()) } return msg
def resize_resource(self, data): """Update the order when resize the resource""" action_time = \ gringutils.format_datetime(timeutils.strtime(timeutils.utcnow())) remarks = '%s Has Been Resized' % data.resource_type.capitalize() self._validate_resize(data.as_dict()) if data.resource_type == 'instance': self.master_api.instance_resized(request.context, self._id, action_time, data.new_flavor, data.old_flavor, data.service, data.region_id, remarks) else: self.master_api.resource_resized(request.context, self._id, action_time, data.quantity, remarks)
def router_list(project_id, region_name=None, project_name=None): client = get_neutronclient(region_name) if project_id: routers = client.list_routers(tenant_id=project_id).get('routers') else: routers = client.list_routers().get('routers') formatted_routers = [] for router in routers: created_at = utils.format_datetime(router['created_at']) status = utils.transform_status(router['status']) formatted_routers.append(Router(id=router['id'], name=router['name'], project_id=router['tenant_id'], project_name=project_name, resource_type=const.RESOURCE_ROUTER, status=status, original_status=router['status'], created_at=created_at)) return formatted_routers
def post(self, data): conn = pecan.request.db_conn try: order = conn.create_order(request.context, **data.as_dict()) if order.unit in ['month', 'year']: self.master_api.create_monthly_job( request.context, order.order_id, timeutils.isotime(order.cron_time)) else: action_time = \ gringutils.format_datetime( timeutils.strtime(timeutils.utcnow())) remarks = '%s Has Been Created.' % order.type.capitalize() self.master_api.resource_created(request.context, order.order_id, action_time, remarks) except Exception as e: LOG.exception('Fail to create order: %s, for reason %s' % (data.as_dict(), e))
def router_list(project_id, region_name=None, project_name=None): client = get_neutronclient(region_name) if project_id: routers = client.list_routers(tenant_id=project_id).get('routers') else: routers = client.list_routers().get('routers') formatted_routers = [] for router in routers: created_at = utils.format_datetime(router['created_at']) status = utils.transform_status(router['status']) formatted_routers.append( Router(id=router['id'], name=router['name'], project_id=router['tenant_id'], project_name=project_name, resource_type=const.RESOURCE_ROUTER, status=status, original_status=router['status'], created_at=created_at)) return formatted_routers
def alarm_list(project_id, region_name=None, project_name=None): alarms = get_cmclient(region_name).alarms.list(q=[{ 'field': 'project_id', 'value': project_id }]) formatted_alarms = [] for alarm in alarms: created_at = utils.format_datetime(alarm.created_at) status = utils.transform_status(str(alarm.enabled)) formatted_alarms.append( Alarm(id=alarm.alarm_id, name=alarm.name, status=status, original_status=str(alarm.enabled), resource_type=const.RESOURCE_ALARM, user_id=alarm.user_id, project_id=project_id, project_name=project_name, created_at=created_at)) return formatted_alarms
def share_list(project_id, region_name=None, detailed=True, project_name=None): """To see all shares in the cloud as admin. """ m_client = get_manilaclient(region_name) search_opts = {'all_tenants': 1, 'project_id': project_id} shares = m_client.shares.list(detailed, search_opts=search_opts) formatted_shares = [] for share in shares: created_at = utils.format_datetime(share.created_at) status = utils.transform_status(share.status) formatted_shares.append( Share(id=share.id, name=share.name, size=share.size, volume_type=share.volume_type, status=status, original_status=share.status, resource_type=const.RESOURCE_SHARE, user_id=None, project_id=project_id, project_name=project_name, created_at=created_at)) return formatted_shares
def share_list(project_id, region_name=None, detailed=True, project_name=None): """To see all shares in the cloud as admin. """ m_client = get_manilaclient(region_name) search_opts = {'all_tenants': 1, 'project_id': project_id} shares = m_client.shares.list(detailed, search_opts=search_opts) formatted_shares = [] for share in shares: created_at = utils.format_datetime(share.created_at) status = utils.transform_status(share.status) formatted_shares.append(Share(id=share.id, name=share.name, size=share.size, volume_type=share.volume_type, status=status, original_status=share.status, resource_type=const.RESOURCE_SHARE, user_id = None, project_id = project_id, project_name=project_name, created_at=created_at)) return formatted_shares
def start_resource(self, data): action_time = \ gringutils.format_datetime(timeutils.strtime(timeutils.utcnow())) remarks = '%s Has Been Started' % data.resource_type.capitalize() self.master_api.resource_started(request.context, self._id, action_time, remarks)
def _check_resource_to_order(self, resource, resource_to_order, bad_resources, try_to_fix): try: order = resource_to_order[resource.id] except KeyError: # Situation 1: There may exist resources that have no orders # NOTE(suo): The resource billed by month/year may also has no # order, but for now, we couldn't know which billing type it is # only from the GET resource method, on this occasion, we take # this resource as the hourly billing type, then create the order # in auto-fix process if resource.status == const.STATE_ERROR: bad_resources.append(resource) return if not resource.is_bill: return try_to_fix['1'].append(resource) else: # Situation 2: There may exist resource whose status doesn't match # with its order's if resource.status == const.STATE_ERROR: bad_resources.append(resource) elif order['unit'] in ['month', 'year']: # if the order is billed by month or year, we don't check # it for now, just pass, and set it to checked later pass elif (resource.resource_type == const.RESOURCE_LISTENER and resource.admin_state != order['status']): # for loadbalancer listener action_time = utils.format_datetime(timeutils.strtime()) try_to_fix['2'].append(Situation2Item(order['order_id'], resource.resource_type, action_time, resource.admin_state, resource.project_id)) elif (resource.resource_type != const.RESOURCE_LISTENER and resource.status != order['status']): action_time = utils.format_datetime(timeutils.strtime()) try_to_fix['2'].append(Situation2Item(order['order_id'], resource.resource_type, action_time, resource.status, resource.project_id)) # Situation 3: Resource's order has been created, but its bill not # be created by master elif (not order['cron_time'] and order['status'] != const.STATE_STOPPED): try_to_fix['3'].append(Situation3Item(order['order_id'], resource.created_at, resource.project_id)) # Situation 5: The order's unit_price is different from the # resource's actual price else: unit_price = ( self.RESOURCE_CREATE_MAP[resource.resource_type].\ get_unit_price(resource, 'hour')) order_unit_price = utils._quantize_decimal(order['unit_price']) if unit_price is not None and unit_price != order_unit_price: try_to_fix['5'].append(Situation5Item(order['order_id'], resource, unit_price, resource.project_id)) resource_to_order[resource.id]['checked'] = True