diff --git a/distributedcloud/dcorch/db/api.py b/distributedcloud/dcorch/db/api.py index c45cf5669..9446975f7 100644 --- a/distributedcloud/dcorch/db/api.py +++ b/distributedcloud/dcorch/db/api.py @@ -28,7 +28,7 @@ from oslo_db import api CONF = cfg.CONF -_BACKEND_MAPPING = {'sqlalchemy': 'dcorch.db.sqlalchemy.api'} +_BACKEND_MAPPING = {"sqlalchemy": "dcorch.db.sqlalchemy.api"} IMPL = api.DBAPI.from_config(CONF, backend_mapping=_BACKEND_MAPPING) @@ -116,10 +116,10 @@ def db_version(engine): return IMPL.db_version(engine) -def service_create(context, service_id, host=None, binary=None, - topic=None): - return IMPL.service_create(context, service_id=service_id, host=host, - binary=binary, topic=topic) +def service_create(context, service_id, host=None, binary=None, topic=None): + return IMPL.service_create( + context, service_id=service_id, host=host, binary=binary, topic=topic + ) def service_update(context, service_id, values=None): @@ -142,51 +142,60 @@ def subcloud_get(context, region_id): return IMPL.subcloud_get(context, region_id) -def subcloud_get_all(context, region_name=None, - management_state=None, - availability_status=None, - initial_sync_state=None): - return IMPL.subcloud_get_all(context, region_name=region_name, - management_state=management_state, - availability_status=availability_status, - initial_sync_state=initial_sync_state) - - -def subcloud_capabilities_get_all(context, region_name=None, - management_state=None, - availability_status=None, - initial_sync_state=None): - return IMPL.subcloud_capabilities_get_all( - context, region_name=region_name, +def subcloud_get_all( + context, + region_name=None, + management_state=None, + availability_status=None, + initial_sync_state=None, +): + return IMPL.subcloud_get_all( + context, + region_name=region_name, management_state=management_state, availability_status=availability_status, - initial_sync_state=initial_sync_state) + initial_sync_state=initial_sync_state, + ) -def subcloud_sync_update_all_to_in_progress(context, - management_state, - availability_status, - initial_sync_state, - sync_requests): +def subcloud_capabilities_get_all( + context, + region_name=None, + management_state=None, + availability_status=None, + initial_sync_state=None, +): + return IMPL.subcloud_capabilities_get_all( + context, + region_name=region_name, + management_state=management_state, + availability_status=availability_status, + initial_sync_state=initial_sync_state, + ) + + +def subcloud_sync_update_all_to_in_progress( + context, management_state, availability_status, initial_sync_state, sync_requests +): return IMPL.subcloud_sync_update_all_to_in_progress( context, management_state=management_state, availability_status=availability_status, initial_sync_state=initial_sync_state, - sync_requests=sync_requests) + sync_requests=sync_requests, + ) -def subcloud_audit_update_all_to_in_progress(context, - management_state, - availability_status, - initial_sync_state, - audit_interval): +def subcloud_audit_update_all_to_in_progress( + context, management_state, availability_status, initial_sync_state, audit_interval +): return IMPL.subcloud_audit_update_all_to_in_progress( context, management_state=management_state, availability_status=availability_status, initial_sync_state=initial_sync_state, - audit_interval=audit_interval) + audit_interval=audit_interval, + ) def subcloud_create(context, region_name, values): @@ -201,21 +210,24 @@ def subcloud_delete(context, region_name): return IMPL.subcloud_delete(context, region_name) -def subcloud_update_initial_state(context, subcloud_name, - pre_initial_sync_state, initial_sync_state): +def subcloud_update_initial_state( + context, subcloud_name, pre_initial_sync_state, initial_sync_state +): return IMPL.subcloud_update_initial_state( - context, subcloud_name, pre_initial_sync_state, initial_sync_state) + context, subcloud_name, pre_initial_sync_state, initial_sync_state + ) -def subcloud_update_all_initial_state(context, pre_initial_sync_state, - initial_sync_state): +def subcloud_update_all_initial_state( + context, pre_initial_sync_state, initial_sync_state +): return IMPL.subcloud_update_all_initial_state( - context, pre_initial_sync_state, initial_sync_state) + context, pre_initial_sync_state, initial_sync_state + ) def resource_get_by_type_and_master_id(context, resource_type, master_id): - return IMPL.resource_get_by_type_and_master_id( - context, resource_type, master_id) + return IMPL.resource_get_by_type_and_master_id(context, resource_type, master_id) def resource_get_by_id(context, id): @@ -254,10 +266,10 @@ def subcloud_resources_get_by_resource(context, resource_id): return IMPL.subcloud_resources_get_by_resource(context, resource_id) -def subcloud_resource_get_by_resource_and_subcloud( - context, resource_id, subcloud_id): +def subcloud_resource_get_by_resource_and_subcloud(context, resource_id, subcloud_id): return IMPL.subcloud_resource_get_by_resource_and_subcloud( - context, resource_id, subcloud_id) + context, resource_id, subcloud_id + ) def subcloud_resources_get_all(context): @@ -265,13 +277,11 @@ def subcloud_resources_get_all(context): def subcloud_resource_create(context, subcloud_id, resource_id, values): - return IMPL.subcloud_resource_create(context, - subcloud_id, resource_id, values) + return IMPL.subcloud_resource_create(context, subcloud_id, resource_id, values) def subcloud_resource_update(context, subcloud_resource_id, values): - return IMPL.subcloud_resource_update(context, - subcloud_resource_id, values) + return IMPL.subcloud_resource_update(context, subcloud_resource_id, values) def subcloud_resource_delete(context, subcloud_resource_id): @@ -286,10 +296,10 @@ def orch_job_get_all(context, resource_id=None): return IMPL.orch_job_get_all(context, resource_id=resource_id) -def orch_job_create(context, resource_id, endpoint_type, - operation_type, values): - return IMPL.orch_job_create(context, resource_id, endpoint_type, - operation_type, values) +def orch_job_create(context, resource_id, endpoint_type, operation_type, values): + return IMPL.orch_job_create( + context, resource_id, endpoint_type, operation_type, values + ) def orch_job_update(context, orch_job_id, values): @@ -312,11 +322,9 @@ def orch_request_get_all(context, orch_job_id=None): return IMPL.orch_request_get_all(context, orch_job_id=orch_job_id) -def orch_request_get_by_attrs(context, - endpoint_type, - resource_type=None, - target_region_name=None, - states=None): +def orch_request_get_by_attrs( + context, endpoint_type, resource_type=None, target_region_name=None, states=None +): """Query OrchRequests by attributes. :param context: authorization context @@ -331,12 +339,12 @@ def orch_request_get_by_attrs(context, endpoint_type, resource_type=resource_type, target_region_name=target_region_name, - states=states) + states=states, + ) def orch_request_create(context, orch_job_id, target_region_name, values): - return IMPL.orch_request_create(context, orch_job_id, - target_region_name, values) + return IMPL.orch_request_create(context, orch_job_id, target_region_name, values) def orch_request_create_bulk(context, orch_requests): @@ -356,8 +364,7 @@ def orch_request_delete_by_subcloud(context, region_name): def orch_request_delete_previous_failed_requests(context, delete_timestamp): - return IMPL.orch_request_delete_previous_failed_requests( - context, delete_timestamp) + return IMPL.orch_request_delete_previous_failed_requests(context, delete_timestamp) # Periodic cleanup @@ -370,18 +377,17 @@ def subcloud_sync_get(context, subcloud_name, endpoint_type): def subcloud_sync_update(context, subcloud_name, endpoint_type, values): - return IMPL.subcloud_sync_update(context, subcloud_name, endpoint_type, - values) + return IMPL.subcloud_sync_update(context, subcloud_name, endpoint_type, values) def subcloud_sync_update_all(context, management_state, endpoint_type, values): - return IMPL.subcloud_sync_update_all(context, management_state, endpoint_type, - values) + return IMPL.subcloud_sync_update_all( + context, management_state, endpoint_type, values + ) def subcloud_sync_create(context, subcloud_name, endpoint_type, values): - return IMPL.subcloud_sync_create(context, subcloud_name, endpoint_type, - values) + return IMPL.subcloud_sync_create(context, subcloud_name, endpoint_type, values) def subcloud_sync_delete(context, subcloud_name, endpoint_type): diff --git a/distributedcloud/dcorch/db/sqlalchemy/api.py b/distributedcloud/dcorch/db/sqlalchemy/api.py index 8720bf795..24353bffb 100644 --- a/distributedcloud/dcorch/db/sqlalchemy/api.py +++ b/distributedcloud/dcorch/db/sqlalchemy/api.py @@ -79,7 +79,7 @@ def write_session(): return _get_main_context_manager().writer.using(_CONTEXT) -_DEFAULT_QUOTA_NAME = 'default' +_DEFAULT_QUOTA_NAME = "default" def get_backend(): @@ -88,12 +88,12 @@ def get_backend(): def model_query(context, *args, **kwargs): - session = kwargs.get('session') + session = kwargs.get("session") if session: - return session.query(*args).options(joinedload_all('*')) + return session.query(*args).options(joinedload_all("*")) else: with read_session() as session: - return session.query(*args).options(joinedload_all('*')) + return session.query(*args).options(joinedload_all("*")) def _session(context): @@ -103,9 +103,8 @@ def _session(context): def is_admin_context(context): """Indicate if the request context is an administrator.""" if not context: - LOG.warning(_('Use of empty request context is deprecated'), - DeprecationWarning) - raise Exception('die') + LOG.warning(_("Use of empty request context is deprecated"), DeprecationWarning) + raise Exception("die") return context.is_admin @@ -125,6 +124,7 @@ def require_admin_context(f): The first argument to the wrapped function must be the context. """ + def wrapper(*args, **kwargs): if not is_admin_context(args[0]): raise exception.AdminRequired() @@ -142,6 +142,7 @@ def require_context(f): The first argument to the wrapped function must be the context. """ + def wrapper(*args, **kwargs): if not is_admin_context(args[0]) and not is_user_context(args[0]): raise exception.NotAuthorized() @@ -155,10 +156,12 @@ def require_context(f): @require_context def _quota_get(context, project_id, resource, session=None): - result = model_query(context, models.Quota). \ - filter_by(project_id=project_id). \ - filter_by(resource=resource). \ - first() + result = ( + model_query(context, models.Quota) + .filter_by(project_id=project_id) + .filter_by(resource=resource) + .first() + ) if not result: raise exception.ProjectQuotaNotFound(project_id=project_id) @@ -173,10 +176,8 @@ def quota_get(context, project_id, resource): @require_context def quota_get_all_by_project(context, project_id): - rows = model_query(context, models.Quota). \ - filter_by(project_id=project_id). \ - all() - result = {'project_id': project_id} + rows = model_query(context, models.Quota).filter_by(project_id=project_id).all() + result = {"project_id": project_id} for row in rows: result[row.resource] = row.hard_limit return result @@ -217,9 +218,9 @@ def quota_destroy(context, project_id, resource): def quota_destroy_all(context, project_id): with write_session() as session: - quotas = model_query(context, models.Quota). \ - filter_by(project_id=project_id). \ - all() + quotas = ( + model_query(context, models.Quota).filter_by(project_id=project_id).all() + ) if not quotas: raise exception.ProjectQuotaNotFound(project_id=project_id) @@ -230,13 +231,16 @@ def quota_destroy_all(context, project_id): ########################## + @require_context def _quota_class_get(context, class_name, resource): - result = model_query(context, models.QuotaClass). \ - filter_by(deleted=0). \ - filter_by(class_name=class_name). \ - filter_by(resource=resource). \ - first() + result = ( + model_query(context, models.QuotaClass) + .filter_by(deleted=0) + .filter_by(class_name=class_name) + .filter_by(resource=resource) + .first() + ) if not result: raise exception.QuotaClassNotFound(class_name=class_name) @@ -256,12 +260,14 @@ def quota_class_get_default(context): @require_context def quota_class_get_all_by_name(context, class_name): - rows = model_query(context, models.QuotaClass). \ - filter_by(deleted=0). \ - filter_by(class_name=class_name). \ - all() + rows = ( + model_query(context, models.QuotaClass) + .filter_by(deleted=0) + .filter_by(class_name=class_name) + .all() + ) - result = {'class_name': class_name} + result = {"class_name": class_name} for row in rows: result[row.resource] = row.hard_limit @@ -282,10 +288,13 @@ def quota_class_create(context, class_name, resource, limit): @require_admin_context def quota_class_update(context, class_name, resource, limit): with write_session() as session: - quota_class_ref = session.query(models.QuotaClass). \ - filter_by(deleted=0). \ - filter_by(class_name=class_name). \ - filter_by(resource=resource).first() + quota_class_ref = ( + session.query(models.QuotaClass) + .filter_by(deleted=0) + .filter_by(class_name=class_name) + .filter_by(resource=resource) + .first() + ) if not quota_class_ref: raise exception.QuotaClassNotFound(class_name=class_name) quota_class_ref.hard_limit = limit @@ -296,10 +305,12 @@ def quota_class_update(context, class_name, resource, limit): @require_admin_context def quota_class_destroy_all(context, class_name): with write_session() as session: - quota_classes = session.query(models.QuotaClass). \ - filter_by(deleted=0). \ - filter_by(class_name=class_name). \ - all() + quota_classes = ( + session.query(models.QuotaClass) + .filter_by(deleted=0) + .filter_by(class_name=class_name) + .all() + ) if quota_classes: for quota_class_ref in quota_classes: session.delete(quota_class_ref) @@ -317,16 +328,17 @@ def db_version(engine): return migration.db_version(engine) -def service_create(context, service_id, host=None, binary=None, - topic=None): +def service_create(context, service_id, host=None, binary=None, topic=None): with write_session() as session: time_now = timeutils.utcnow() - svc = models.Service(id=service_id, - host=host, - binary=binary, - topic=topic, - created_at=time_now, - updated_at=time_now) + svc = models.Service( + id=service_id, + host=host, + binary=binary, + topic=topic, + created_at=time_now, + updated_at=time_now, + ) session.add(svc) return svc @@ -340,7 +352,7 @@ def service_update(context, service_id, values=None): if values is None: values = {} - values.update({'updated_at': timeutils.utcnow()}) + values.update({"updated_at": timeutils.utcnow()}) service.update(values) service.save(session) return service @@ -348,8 +360,9 @@ def service_update(context, service_id, values=None): def service_delete(context, service_id): with write_session() as session: - session.query(models.Service).filter_by( - id=service_id).delete(synchronize_session='fetch') + session.query(models.Service).filter_by(id=service_id).delete( + synchronize_session="fetch" + ) def service_get(context, service_id): @@ -362,10 +375,9 @@ def service_get_all(context): ########################## + # dbapi for orchestrator -def add_identity_filter(query, value, - use_region_name=None, - use_resource_type=None): +def add_identity_filter(query, value, use_region_name=None, use_resource_type=None): """Adds an identity filter to a query. Filters results by 'id', if supplied value is a valid integer. @@ -406,18 +418,18 @@ def add_filter_by_many_identities(query, model, values): raise exception.Invalid() value = values[0] if strutils.is_int_like(value): - return query.filter(getattr(model, 'id').in_(values)), 'id' + return query.filter(getattr(model, "id").in_(values)), "id" elif uuidutils.is_uuid_like(value): - return query.filter(getattr(model, 'uuid').in_(values)), 'uuid' + return query.filter(getattr(model, "uuid").in_(values)), "uuid" else: raise exception.InvalidParameterValue( - err="Invalid identity filter value %s" % value) + err="Invalid identity filter value %s" % value + ) @require_context def _subcloud_get(context, region_id, session=None): - query = model_query(context, models.Subcloud, session=session). \ - filter_by(deleted=0) + query = model_query(context, models.Subcloud, session=session).filter_by(deleted=0) query = add_identity_filter(query, region_id, use_region_name=True) try: @@ -426,7 +438,8 @@ def _subcloud_get(context, region_id, session=None): raise exception.SubcloudNotFound(region_name=region_id) except MultipleResultsFound: raise exception.InvalidParameterValue( - err="Multiple entries found for subcloud %s" % region_id) + err="Multiple entries found for subcloud %s" % region_id + ) @require_context @@ -435,12 +448,14 @@ def subcloud_get(context, region_id): @require_context -def subcloud_get_all(context, region_name=None, - management_state=None, - availability_status=None, - initial_sync_state=None): - query = model_query(context, models.Subcloud). \ - filter_by(deleted=0) +def subcloud_get_all( + context, + region_name=None, + management_state=None, + availability_status=None, + initial_sync_state=None, +): + query = model_query(context, models.Subcloud).filter_by(deleted=0) if region_name: query = add_identity_filter(query, region_name, use_region_name=True) @@ -454,79 +469,92 @@ def subcloud_get_all(context, region_name=None, @require_context -def subcloud_capabilities_get_all(context, region_name=None, - management_state=None, - availability_status=None, - initial_sync_state=None): - results = subcloud_get_all(context, region_name, management_state, - availability_status, initial_sync_state) +def subcloud_capabilities_get_all( + context, + region_name=None, + management_state=None, + availability_status=None, + initial_sync_state=None, +): + results = subcloud_get_all( + context, region_name, management_state, availability_status, initial_sync_state + ) return { - result['region_name']: (result['capabilities'], result['management_ip']) + result["region_name"]: (result["capabilities"], result["management_ip"]) for result in results } @require_context -def subcloud_sync_update_all_to_in_progress(context, - management_state, - availability_status, - initial_sync_state, - sync_requests): +def subcloud_sync_update_all_to_in_progress( + context, management_state, availability_status, initial_sync_state, sync_requests +): with write_session() as session: # Fetch the records of subcloud_sync that meet the update criteria - subcloud_sync_rows = session.query(models.SubcloudSync, - models.Subcloud.management_ip).join( - models.Subcloud, - models.Subcloud.region_name == models.SubcloudSync.subcloud_name - ).filter( - models.Subcloud.management_state == management_state, - models.Subcloud.availability_status == availability_status, - models.Subcloud.initial_sync_state == initial_sync_state, - models.SubcloudSync.sync_request.in_(sync_requests) - ).all() + subcloud_sync_rows = ( + session.query(models.SubcloudSync, models.Subcloud.management_ip) + .join( + models.Subcloud, + models.Subcloud.region_name == models.SubcloudSync.subcloud_name, + ) + .filter( + models.Subcloud.management_state == management_state, + models.Subcloud.availability_status == availability_status, + models.Subcloud.initial_sync_state == initial_sync_state, + models.SubcloudSync.sync_request.in_(sync_requests), + ) + .all() + ) # Update the sync status to in-progress for the selected subcloud_sync # records updated_rows = [] for subcloud_sync, management_ip in subcloud_sync_rows: subcloud_sync.sync_request = consts.SYNC_STATUS_IN_PROGRESS - updated_rows.append((subcloud_sync.subcloud_name, - subcloud_sync.endpoint_type, - management_ip)) + updated_rows.append( + ( + subcloud_sync.subcloud_name, + subcloud_sync.endpoint_type, + management_ip, + ) + ) return updated_rows @require_context -def subcloud_audit_update_all_to_in_progress(context, - management_state, - availability_status, - initial_sync_state, - audit_interval): +def subcloud_audit_update_all_to_in_progress( + context, management_state, availability_status, initial_sync_state, audit_interval +): threshold_time = timeutils.utcnow() - datetime.timedelta(seconds=audit_interval) with write_session() as session: # Fetch the records of subcloud_sync that meet the update criteria - subcloud_sync_rows = session.query(models.SubcloudSync, - models.Subcloud.management_ip).join( - models.Subcloud, - models.Subcloud.region_name == models.SubcloudSync.subcloud_name - ).filter( - models.Subcloud.management_state == management_state, - models.Subcloud.availability_status == availability_status, - models.Subcloud.initial_sync_state == initial_sync_state, - or_( - # Search those with conditional audit status - # (completed/in-progress) and the last audit time is equal - # or greater than the audit interval - and_( - models.SubcloudSync.audit_status.in_( - consts.AUDIT_CONDITIONAL_STATUS), - models.SubcloudSync.last_audit_time <= threshold_time - ), - models.SubcloudSync.audit_status.in_(consts.AUDIT_QUALIFIED_STATUS) + subcloud_sync_rows = ( + session.query(models.SubcloudSync, models.Subcloud.management_ip) + .join( + models.Subcloud, + models.Subcloud.region_name == models.SubcloudSync.subcloud_name, ) - ).all() + .filter( + models.Subcloud.management_state == management_state, + models.Subcloud.availability_status == availability_status, + models.Subcloud.initial_sync_state == initial_sync_state, + or_( + # Search those with conditional audit status + # (completed/in-progress) and the last audit time is equal + # or greater than the audit interval + and_( + models.SubcloudSync.audit_status.in_( + consts.AUDIT_CONDITIONAL_STATUS + ), + models.SubcloudSync.last_audit_time <= threshold_time, + ), + models.SubcloudSync.audit_status.in_(consts.AUDIT_QUALIFIED_STATUS), + ), + ) + .all() + ) # Update the audit status to in-progress for the selected subcloud_sync # records @@ -534,9 +562,13 @@ def subcloud_audit_update_all_to_in_progress(context, for subcloud_sync, management_ip in subcloud_sync_rows: subcloud_sync.audit_status = consts.AUDIT_STATUS_IN_PROGRESS subcloud_sync.last_audit_time = timeutils.utcnow() - updated_rows.append((subcloud_sync.subcloud_name, - subcloud_sync.endpoint_type, - management_ip)) + updated_rows.append( + ( + subcloud_sync.subcloud_name, + subcloud_sync.endpoint_type, + management_ip, + ) + ) return updated_rows @@ -546,8 +578,8 @@ def subcloud_create(context, region_name, values): with write_session() as session: result = models.Subcloud() result.region_name = region_name - if not values.get('uuid'): - values['uuid'] = uuidutils.generate_uuid() + if not values.get("uuid"): + values["uuid"] = uuidutils.generate_uuid() result.update(values) try: session.add(result) @@ -568,10 +600,12 @@ def subcloud_update(context, region_name, values): @require_admin_context def subcloud_delete(context, region_name): with write_session() as session: - subclouds = session.query(models.Subcloud). \ - filter_by(deleted=0). \ - filter_by(region_name=region_name). \ - all() + subclouds = ( + session.query(models.Subcloud) + .filter_by(deleted=0) + .filter_by(region_name=region_name) + .all() + ) if subclouds: for subcloud_ref in subclouds: session.delete(subcloud_ref) @@ -580,31 +614,36 @@ def subcloud_delete(context, region_name): @require_admin_context -def subcloud_update_initial_state(context, region_name, - pre_initial_sync_state, initial_sync_state): +def subcloud_update_initial_state( + context, region_name, pre_initial_sync_state, initial_sync_state +): with write_session() as session: - result = session.query(models.Subcloud) \ - .filter_by(region_name=region_name) \ - .filter_by(initial_sync_state=pre_initial_sync_state) \ + result = ( + session.query(models.Subcloud) + .filter_by(region_name=region_name) + .filter_by(initial_sync_state=pre_initial_sync_state) .update({models.Subcloud.initial_sync_state: initial_sync_state}) + ) return result @require_admin_context -def subcloud_update_all_initial_state(context, pre_initial_sync_state, - initial_sync_state): +def subcloud_update_all_initial_state( + context, pre_initial_sync_state, initial_sync_state +): with write_session() as session: - updated_count = session.query(models.Subcloud) \ - .filter_by(deleted=0) \ - .filter_by(initial_sync_state=pre_initial_sync_state) \ + updated_count = ( + session.query(models.Subcloud) + .filter_by(deleted=0) + .filter_by(initial_sync_state=pre_initial_sync_state) .update({models.Subcloud.initial_sync_state: initial_sync_state}) + ) return updated_count @require_context def _resource_get(context, resource_type, master_id, session): - query = model_query(context, models.Resource, session=session). \ - filter_by(deleted=0) + query = model_query(context, models.Resource, session=session).filter_by(deleted=0) query = query.filter_by(resource_type=resource_type) query = query.filter_by(master_id=master_id) try: @@ -613,8 +652,11 @@ def _resource_get(context, resource_type, master_id, session): raise exception.ResourceNotFound(resource_type=resource_type) except MultipleResultsFound: raise exception.InvalidParameterValue( - err=("Multiple entries found for resource %(id)s of type %(type)s", - {'id': master_id, 'type': resource_type})) + err=( + "Multiple entries found for resource %(id)s of type %(type)s", + {"id": master_id, "type": resource_type}, + ) + ) @require_context @@ -625,8 +667,7 @@ def resource_get_by_type_and_master_id(context, resource_type, master_id): @require_context def resource_get_by_id(context, resource_id, session=None): - query = model_query(context, models.Resource, session=session). \ - filter_by(deleted=0) + query = model_query(context, models.Resource, session=session).filter_by(deleted=0) query = query.filter_by(id=resource_id) try: return query.one() @@ -636,12 +677,10 @@ def resource_get_by_id(context, resource_id, session=None): @require_context def resource_get_all(context, resource_type=None): - query = model_query(context, models.Resource). \ - filter_by(deleted=0) + query = model_query(context, models.Resource).filter_by(deleted=0) if resource_type: - query = add_identity_filter(query, resource_type, - use_resource_type=True) + query = add_identity_filter(query, resource_type, use_resource_type=True) return query.all() @@ -651,8 +690,8 @@ def resource_create(context, resource_type, values): with write_session() as session: result = models.Resource() result.resource_type = resource_type - if not values.get('uuid'): - values['uuid'] = uuidutils.generate_uuid() + if not values.get("uuid"): + values["uuid"] = uuidutils.generate_uuid() result.update(values) session.add(result) return result @@ -670,11 +709,13 @@ def resource_update(context, resource_id, values): @require_admin_context def resource_delete(context, resource_type, master_id): with write_session() as session: - resources = session.query(models.Resource). \ - filter_by(deleted=0). \ - filter_by(resource_type=resource_type). \ - filter_by(master_id=master_id). \ - all() + resources = ( + session.query(models.Resource) + .filter_by(deleted=0) + .filter_by(resource_type=resource_type) + .filter_by(master_id=master_id) + .all() + ) if resources: for resource_ref in resources: session.delete(resource_ref) @@ -691,8 +732,9 @@ def add_subcloud_resource_filter_by_subcloud(query, value): @require_context def _subcloud_resource_get(context, subcloud_resource_id, session=None): - query = model_query(context, models.SubcloudResource, session=session). \ - filter_by(deleted=0) + query = model_query(context, models.SubcloudResource, session=session).filter_by( + deleted=0 + ) query = add_identity_filter(query, subcloud_resource_id) try: return query.one() @@ -707,53 +749,55 @@ def subcloud_resource_get(context, subcloud_resource_id): @require_context def subcloud_resources_get_by_subcloud(context, subcloud_id): - query = model_query(context, models.SubcloudResource). \ - filter_by(deleted=0) + query = model_query(context, models.SubcloudResource).filter_by(deleted=0) if subcloud_id: - query = (query.join(models.Subcloud, - models.Subcloud.id == - models.SubcloudResource.subcloud_id)) + query = query.join( + models.Subcloud, models.Subcloud.id == models.SubcloudResource.subcloud_id + ) query, field = add_filter_by_many_identities( - query, models.Subcloud, [subcloud_id]) + query, models.Subcloud, [subcloud_id] + ) return query.all() @require_context def subcloud_resources_get_by_resource(context, resource_id): # query by resource id or uuid, not resource master uuid. - query = model_query(context, models.SubcloudResource). \ - filter_by(deleted=0) + query = model_query(context, models.SubcloudResource).filter_by(deleted=0) if resource_id: - query = (query.join(models.Resource, - models.Resource.id == - models.SubcloudResource.resource_id)) + query = query.join( + models.Resource, models.Resource.id == models.SubcloudResource.resource_id + ) query, field = add_filter_by_many_identities( - query, models.Resource, [resource_id]) + query, models.Resource, [resource_id] + ) return query.all() def subcloud_resources_get_all(context): - query = model_query(context, models.SubcloudResource). \ - filter_by(deleted=0) + query = model_query(context, models.SubcloudResource).filter_by(deleted=0) return query.all() @require_context -def subcloud_resource_get_by_resource_and_subcloud( - context, resource_id, subcloud_id): - query = model_query(context, models.SubcloudResource). \ - filter_by(deleted=0). \ - filter_by(resource_id=resource_id). \ - filter_by(subcloud_id=subcloud_id) +def subcloud_resource_get_by_resource_and_subcloud(context, resource_id, subcloud_id): + query = ( + model_query(context, models.SubcloudResource) + .filter_by(deleted=0) + .filter_by(resource_id=resource_id) + .filter_by(subcloud_id=subcloud_id) + ) try: return query.one() except NoResultFound: raise exception.SubcloudResourceNotFound() except MultipleResultsFound: raise exception.InvalidParameterValue( - err=("Multiple entries found for resource %(rid)d " - "subcloud %(sid)d", - {'rid': resource_id, 'sid': subcloud_id})) + err=( + "Multiple entries found for resource %(rid)d subcloud %(sid)d", + {"rid": resource_id, "sid": subcloud_id}, + ) + ) @require_admin_context @@ -762,15 +806,15 @@ def subcloud_resource_create(context, subcloud_id, resource_id, values): result = models.SubcloudResource() result.subcloud_id = subcloud_id result.resource_id = resource_id - if not values.get('uuid'): - values['uuid'] = uuidutils.generate_uuid() + if not values.get("uuid"): + values["uuid"] = uuidutils.generate_uuid() result.update(values) try: session.add(result) except db_exc.DBDuplicateEntry: raise exception.SubcloudResourceAlreadyExists( - subcloud_id=subcloud_id, - resource_id=resource_id) + subcloud_id=subcloud_id, resource_id=resource_id + ) return result @@ -786,14 +830,12 @@ def subcloud_resource_update(context, subcloud_resource_id, values): @require_admin_context def subcloud_resource_delete(context, subcloud_resource_id): with write_session() as session: - query = session.query(models.SubcloudResource). \ - filter_by(deleted=0) + query = session.query(models.SubcloudResource).filter_by(deleted=0) query = add_identity_filter(query, subcloud_resource_id) try: subcloud_resource_ref = query.one() except NoResultFound: - raise exception.SubcloudResourceNotFound( - resource=subcloud_resource_id) + raise exception.SubcloudResourceNotFound(resource=subcloud_resource_id) session.delete(subcloud_resource_ref) @@ -806,8 +848,7 @@ def add_orch_job_filter_by_resource(query, value): @require_context def _orch_job_get(context, orch_job_id, session=None): - query = model_query(context, models.OrchJob, session=session). \ - filter_by(deleted=0) + query = model_query(context, models.OrchJob, session=session).filter_by(deleted=0) query = add_identity_filter(query, orch_job_id) try: return query.one() @@ -822,26 +863,26 @@ def orch_job_get(context, orch_job_id): @require_context def orch_job_get_all(context, resource_id=None): - query = model_query(context, models.OrchJob). \ - filter_by(deleted=0) + query = model_query(context, models.OrchJob).filter_by(deleted=0) if resource_id: - query = (query.join(models.Resource, - models.Resource.id == models.OrchJob.resource_id)) + query = query.join( + models.Resource, models.Resource.id == models.OrchJob.resource_id + ) query, field = add_filter_by_many_identities( - query, models.Resource, [resource_id]) + query, models.Resource, [resource_id] + ) return query.all() @require_admin_context -def orch_job_create(context, resource_id, endpoint_type, - operation_type, values): +def orch_job_create(context, resource_id, endpoint_type, operation_type, values): with write_session() as session: result = models.OrchJob() result.resource_id = resource_id result.endpoint_type = endpoint_type result.operation_type = operation_type - if not values.get('uuid'): - values['uuid'] = uuidutils.generate_uuid() + if not values.get("uuid"): + values["uuid"] = uuidutils.generate_uuid() result.update(values) try: session.add(result) @@ -849,7 +890,8 @@ def orch_job_create(context, resource_id, endpoint_type, raise exception.OrchJobAlreadyExists( resource_id=resource_id, endpoint_type=endpoint_type, - operation_type=operation_type) + operation_type=operation_type, + ) return result @@ -865,8 +907,7 @@ def orch_job_update(context, orch_job_id, values): @require_admin_context def orch_job_delete(context, orch_job_id): with write_session() as session: - query = session.query(models.OrchJob). \ - filter_by(deleted=0) + query = session.query(models.OrchJob).filter_by(deleted=0) query = add_identity_filter(query, orch_job_id) try: orch_job_ref = query.one() @@ -884,8 +925,9 @@ def add_orch_request_filter_by_resource(query, value): @require_context def _orch_request_get(context, orch_request_id, session=None): - query = model_query(context, models.OrchRequest, session=session). \ - filter_by(deleted=0) + query = model_query(context, models.OrchRequest, session=session).filter_by( + deleted=0 + ) query = add_identity_filter(query, orch_request_id) try: return query.one() @@ -900,9 +942,11 @@ def orch_request_get(context, orch_request_id): @require_context def orch_request_get_most_recent_failed_request(context): - query = model_query(context, models.OrchRequest). \ - filter_by(deleted=0). \ - filter_by(state=consts.ORCH_REQUEST_STATE_FAILED) + query = ( + model_query(context, models.OrchRequest) + .filter_by(deleted=0) + .filter_by(state=consts.ORCH_REQUEST_STATE_FAILED) + ) try: return query.order_by(desc(models.OrchRequest.updated_at)).first() @@ -912,23 +956,21 @@ def orch_request_get_most_recent_failed_request(context): @require_context def orch_request_get_all(context, orch_job_id=None): - query = model_query(context, models.OrchRequest). \ - filter_by(deleted=0) + query = model_query(context, models.OrchRequest).filter_by(deleted=0) if orch_job_id: - query = (query.join(models.OrchJob, - models.OrchJob.id == - models.OrchRequest.orch_job_id)) + query = query.join( + models.OrchJob, models.OrchJob.id == models.OrchRequest.orch_job_id + ) query, field = add_filter_by_many_identities( - query, models.OrchJob, [orch_job_id]) + query, models.OrchJob, [orch_job_id] + ) return query.all() @require_context -def orch_request_get_by_attrs(context, - endpoint_type, - resource_type=None, - target_region_name=None, - states=None): +def orch_request_get_by_attrs( + context, endpoint_type, resource_type=None, target_region_name=None, states=None +): """Query OrchRequests by attributes. :param context: authorization context @@ -938,8 +980,7 @@ def orch_request_get_by_attrs(context, :param states: [OrchRequest.state] note: must be a list :return: [OrchRequests] sorted by OrchRequest.id """ - query = model_query(context, models.OrchRequest). \ - filter_by(deleted=0) + query = model_query(context, models.OrchRequest).filter_by(deleted=0) if target_region_name: query = query.filter_by(target_region_name=target_region_name) @@ -948,14 +989,14 @@ def orch_request_get_by_attrs(context, states = set(states) query = query.filter(models.OrchRequest.state.in_(states)) - query = query.join(models.OrchJob, - models.OrchJob.id == models.OrchRequest.orch_job_id). \ - filter_by(endpoint_type=endpoint_type) + query = query.join( + models.OrchJob, models.OrchJob.id == models.OrchRequest.orch_job_id + ).filter_by(endpoint_type=endpoint_type) if resource_type is not None: - query = query.join(models.Resource, - models.Resource.id == models.OrchJob.resource_id). \ - filter_by(resource_type=resource_type) + query = query.join( + models.Resource, models.Resource.id == models.OrchJob.resource_id + ).filter_by(resource_type=resource_type) # sort by orch_request id query = query.order_by(asc(models.OrchRequest.id)).all() @@ -969,29 +1010,31 @@ def orch_request_create(context, orch_job_id, target_region_name, values): result = models.OrchRequest() result.orch_job_id = orch_job_id result.target_region_name = target_region_name - if not values.get('uuid'): - values['uuid'] = uuidutils.generate_uuid() + if not values.get("uuid"): + values["uuid"] = uuidutils.generate_uuid() result.update(values) try: session.add(result) except db_exc.DBDuplicateEntry: raise exception.OrchRequestAlreadyExists( - orch_request=orch_job_id, - target_region_name=target_region_name) + orch_request=orch_job_id, target_region_name=target_region_name + ) return result def orch_request_create_bulk(context, orch_requests): for request in orch_requests: - if 'orch_job_id' not in request: + if "orch_job_id" not in request: raise exception.ObjectActionError( action="create_bulk", - reason="cannot create an OrchRequest object without a orch_job_id set") - if 'target_region_name' not in request: + reason="cannot create an OrchRequest object without a orch_job_id set", + ) + if "target_region_name" not in request: raise exception.ObjectActionError( action="create_bulk", reason="cannot create an OrchRequest object without a " - "target_region_name set") + "target_region_name set", + ) with write_session() as session: session.bulk_insert_mappings(models.OrchRequest, orch_requests) @@ -1008,8 +1051,7 @@ def orch_request_update(context, orch_request_id, values): @require_admin_context def orch_request_destroy(context, orch_request_id): with write_session() as session: - query = session.query(models.OrchRequest). \ - filter_by(deleted=0) + query = session.query(models.OrchRequest).filter_by(deleted=0) query = add_identity_filter(query, orch_request_id) try: orch_request_ref = query.one() @@ -1026,81 +1068,94 @@ def orch_request_delete_by_subcloud(context, region_name): In particular, it is not a bug if there are no entries to delete. """ with write_session() as session: - session.query(models.OrchRequest). \ - filter_by(target_region_name=region_name). \ - delete() + session.query(models.OrchRequest).filter_by( + target_region_name=region_name + ).delete() @require_admin_context def orch_request_delete_previous_failed_requests(context, delete_timestamp): """Soft delete orch_request entries. - This is used to soft delete all previously failed requests at - the end of each audit cycle. + This is used to soft delete all previously failed requests at + the end of each audit cycle. """ - LOG.info('Soft deleting failed orch requests at and before %s', - delete_timestamp) + LOG.info("Soft deleting failed orch requests at and before %s", delete_timestamp) with write_session() as session: - query = session.query(models.OrchRequest). \ - filter_by(deleted=0). \ - filter_by(state=consts.ORCH_REQUEST_STATE_FAILED). \ - filter(models.OrchRequest.updated_at <= delete_timestamp) + query = ( + session.query(models.OrchRequest) + .filter_by(deleted=0) + .filter_by(state=consts.ORCH_REQUEST_STATE_FAILED) + .filter(models.OrchRequest.updated_at <= delete_timestamp) + ) - count = query.update({'deleted': 1, - 'deleted_at': timeutils.utcnow()}) - LOG.info('%d previously failed sync requests soft deleted', count) + count = query.update({"deleted": 1, "deleted_at": timeutils.utcnow()}) + LOG.info("%d previously failed sync requests soft deleted", count) @require_admin_context def purge_deleted_records(context, age_in_days): - deleted_age = \ - timeutils.utcnow() - datetime.timedelta(days=age_in_days) + deleted_age = timeutils.utcnow() - datetime.timedelta(days=age_in_days) - LOG.info('Purging deleted records older than %s', deleted_age) + LOG.info("Purging deleted records older than %s", deleted_age) with write_session() as session: # Purging orch_request table - count = session.query(models.OrchRequest). \ - filter_by(deleted=1). \ - filter(models.OrchRequest.deleted_at < deleted_age).delete() - LOG.info('%d records were purged from orch_request table.', count) + count = ( + session.query(models.OrchRequest) + .filter_by(deleted=1) + .filter(models.OrchRequest.deleted_at < deleted_age) + .delete() + ) + LOG.info("%d records were purged from orch_request table.", count) # Purging orch_job table - subquery = model_query(context, models.OrchRequest.orch_job_id). \ - group_by(models.OrchRequest.orch_job_id) + subquery = model_query(context, models.OrchRequest.orch_job_id).group_by( + models.OrchRequest.orch_job_id + ) - count = session.query(models.OrchJob). \ - filter(~models.OrchJob.id.in_(subquery)). \ - delete(synchronize_session='fetch') - LOG.info('%d records were purged from orch_job table.', count) + count = ( + session.query(models.OrchJob) + .filter(~models.OrchJob.id.in_(subquery)) + .delete(synchronize_session="fetch") + ) + LOG.info("%d records were purged from orch_job table.", count) # Purging resource table - orchjob_subquery = model_query(context, models.OrchJob.resource_id). \ - group_by(models.OrchJob.resource_id) + orchjob_subquery = model_query(context, models.OrchJob.resource_id).group_by( + models.OrchJob.resource_id + ) subcloud_resource_subquery = model_query( - context, models.SubcloudResource.resource_id). \ - group_by(models.SubcloudResource.resource_id) + context, models.SubcloudResource.resource_id + ).group_by(models.SubcloudResource.resource_id) - count = session.query(models.Resource). \ - filter(~models.Resource.id.in_(orchjob_subquery)). \ - filter(~models.Resource.id.in_(subcloud_resource_subquery)). \ - delete(synchronize_session='fetch') - LOG.info('%d records were purged from resource table.', count) + count = ( + session.query(models.Resource) + .filter(~models.Resource.id.in_(orchjob_subquery)) + .filter(~models.Resource.id.in_(subcloud_resource_subquery)) + .delete(synchronize_session="fetch") + ) + LOG.info("%d records were purged from resource table.", count) def _subcloud_sync_get(context, subcloud_name, endpoint_type, session=None): - query = model_query(context, models.SubcloudSync, session=session). \ - filter_by(subcloud_name=subcloud_name). \ - filter_by(endpoint_type=endpoint_type) + query = ( + model_query(context, models.SubcloudSync, session=session) + .filter_by(subcloud_name=subcloud_name) + .filter_by(endpoint_type=endpoint_type) + ) try: return query.one() except NoResultFound: - raise exception.SubcloudSyncNotFound(subcloud_name=subcloud_name, - endpoint_type=endpoint_type) + raise exception.SubcloudSyncNotFound( + subcloud_name=subcloud_name, endpoint_type=endpoint_type + ) except MultipleResultsFound: - err = ("Multiple entries found for subcloud %s endpoint_type %s" % - (subcloud_name, endpoint_type)) + err = "Multiple entries found for subcloud %s endpoint_type %s" % ( + subcloud_name, + endpoint_type, + ) raise exception.InvalidParameterValue(err=err) @@ -1118,15 +1173,14 @@ def subcloud_sync_create(context, subcloud_name, endpoint_type, values): session.add(result) except db_exc.DBDuplicateEntry: raise exception.SubcloudSyncAlreadyExists( - subcloud_name=subcloud_name, - endpoint_type=endpoint_type) + subcloud_name=subcloud_name, endpoint_type=endpoint_type + ) return result def subcloud_sync_update(context, subcloud_name, endpoint_type, values): with write_session() as session: - result = _subcloud_sync_get(context, subcloud_name, endpoint_type, - session) + result = _subcloud_sync_get(context, subcloud_name, endpoint_type, session) result.update(values) result.save(session) return result @@ -1134,17 +1188,20 @@ def subcloud_sync_update(context, subcloud_name, endpoint_type, values): def subcloud_sync_update_all(context, management_state, endpoint_type, values): with write_session() as session: - subquery = select([models.SubcloudSync.id]). \ - where(models.SubcloudSync.subcloud_name == - models.Subcloud.region_name). \ - where(models.Subcloud.management_state == management_state). \ - where(models.SubcloudSync.endpoint_type == endpoint_type). \ - where(models.SubcloudSync.deleted == 0). \ - correlate(models.SubcloudSync) + subquery = ( + select([models.SubcloudSync.id]) + .where(models.SubcloudSync.subcloud_name == models.Subcloud.region_name) + .where(models.Subcloud.management_state == management_state) + .where(models.SubcloudSync.endpoint_type == endpoint_type) + .where(models.SubcloudSync.deleted == 0) + .correlate(models.SubcloudSync) + ) - stmt = update(models.SubcloudSync). \ - where(models.SubcloudSync.id.in_(subquery)). \ - values(values) + stmt = ( + update(models.SubcloudSync) + .where(models.SubcloudSync.id.in_(subquery)) + .values(values) + ) result = session.execute(stmt) @@ -1153,8 +1210,11 @@ def subcloud_sync_update_all(context, management_state, endpoint_type, values): def subcloud_sync_delete(context, subcloud_name, endpoint_type): with write_session() as session: - results = session.query(models.SubcloudSync). \ - filter_by(subcloud_name=subcloud_name). \ - filter_by(endpoint_type=endpoint_type).all() + results = ( + session.query(models.SubcloudSync) + .filter_by(subcloud_name=subcloud_name) + .filter_by(endpoint_type=endpoint_type) + .all() + ) for result in results: session.delete(result) diff --git a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/manage.py b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/manage.py index 39fa3892e..61dd84621 100644 --- a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/manage.py +++ b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/manage.py @@ -1,5 +1,10 @@ #!/usr/bin/env python +# Copyright (c) 2024 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# + from migrate.versioning.shell import main -if __name__ == '__main__': - main(debug='False') +if __name__ == "__main__": + main(debug="False") diff --git a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/001_initial.py b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/001_initial.py index 313791012..d90919f0b 100644 --- a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/001_initial.py +++ b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/001_initial.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017-2018, 2024 Wind River Inc. +# Copyright (c) 2017-2018, 2024 Wind River Inc. # All Rights Reserved. # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain @@ -32,9 +32,9 @@ from oslo_config import cfg import sqlalchemy -QUOTA_CLASS_NAME_DEFAULT = 'default' +QUOTA_CLASS_NAME_DEFAULT = "default" CONF = cfg.CONF -CONF.import_group('dc_orch_global_limit', 'dcorch.common.config') +CONF.import_group("dc_orch_global_limit", "dcorch.common.config") def upgrade(migrate_engine): @@ -42,55 +42,55 @@ def upgrade(migrate_engine): meta.bind = migrate_engine quotas = sqlalchemy.Table( - 'quotas', meta, - sqlalchemy.Column('id', sqlalchemy.Integer, - primary_key=True, nullable=False), - sqlalchemy.Column('project_id', sqlalchemy.String(36)), - sqlalchemy.Column('resource', sqlalchemy.String(255), nullable=False), - sqlalchemy.Column('hard_limit', sqlalchemy.Integer, nullable=False), - sqlalchemy.Column('capabilities', sqlalchemy.Text), - sqlalchemy.Column('created_at', sqlalchemy.DateTime), - sqlalchemy.Column('updated_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted', sqlalchemy.Integer), - mysql_engine='InnoDB', - mysql_charset='utf8' + "quotas", + meta, + sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, nullable=False), + sqlalchemy.Column("project_id", sqlalchemy.String(36)), + sqlalchemy.Column("resource", sqlalchemy.String(255), nullable=False), + sqlalchemy.Column("hard_limit", sqlalchemy.Integer, nullable=False), + sqlalchemy.Column("capabilities", sqlalchemy.Text), + sqlalchemy.Column("created_at", sqlalchemy.DateTime), + sqlalchemy.Column("updated_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted", sqlalchemy.Integer), + mysql_engine="InnoDB", + mysql_charset="utf8", ) quota_classes = sqlalchemy.Table( - 'quota_classes', meta, - sqlalchemy.Column('id', sqlalchemy.Integer, - primary_key=True, nullable=False), - sqlalchemy.Column('class_name', sqlalchemy.String(length=255), - index=True), - sqlalchemy.Column('capabilities', sqlalchemy.Text), - sqlalchemy.Column('created_at', sqlalchemy.DateTime), - sqlalchemy.Column('updated_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted', sqlalchemy.Integer), - sqlalchemy.Column('resource', sqlalchemy.String(length=255)), - sqlalchemy.Column('hard_limit', sqlalchemy.Integer, - nullable=True), - mysql_engine='InnoDB', - mysql_charset='utf8' + "quota_classes", + meta, + sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, nullable=False), + sqlalchemy.Column("class_name", sqlalchemy.String(length=255), index=True), + sqlalchemy.Column("capabilities", sqlalchemy.Text), + sqlalchemy.Column("created_at", sqlalchemy.DateTime), + sqlalchemy.Column("updated_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted", sqlalchemy.Integer), + sqlalchemy.Column("resource", sqlalchemy.String(length=255)), + sqlalchemy.Column("hard_limit", sqlalchemy.Integer, nullable=True), + mysql_engine="InnoDB", + mysql_charset="utf8", ) service = sqlalchemy.Table( - 'service', meta, - sqlalchemy.Column('id', sqlalchemy.String(36), - primary_key=True, nullable=False), - sqlalchemy.Column('host', sqlalchemy.String(length=255)), - sqlalchemy.Column('binary', sqlalchemy.String(length=255)), - sqlalchemy.Column('topic', sqlalchemy.String(length=255)), - sqlalchemy.Column('disabled', sqlalchemy.Boolean, default=False), - sqlalchemy.Column('disabled_reason', sqlalchemy.String(length=255)), - sqlalchemy.Column('capabilities', sqlalchemy.Text), - sqlalchemy.Column('created_at', sqlalchemy.DateTime), - sqlalchemy.Column('updated_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted', sqlalchemy.Integer), - mysql_engine='InnoDB', - mysql_charset='utf8' + "service", + meta, + sqlalchemy.Column( + "id", sqlalchemy.String(36), primary_key=True, nullable=False + ), + sqlalchemy.Column("host", sqlalchemy.String(length=255)), + sqlalchemy.Column("binary", sqlalchemy.String(length=255)), + sqlalchemy.Column("topic", sqlalchemy.String(length=255)), + sqlalchemy.Column("disabled", sqlalchemy.Boolean, default=False), + sqlalchemy.Column("disabled_reason", sqlalchemy.String(length=255)), + sqlalchemy.Column("capabilities", sqlalchemy.Text), + sqlalchemy.Column("created_at", sqlalchemy.DateTime), + sqlalchemy.Column("updated_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted", sqlalchemy.Integer), + mysql_engine="InnoDB", + mysql_charset="utf8", ) tables = ( @@ -108,25 +108,33 @@ def upgrade(migrate_engine): meta.drop_all(tables=tables[:index]) raise - # pylint: disable-next=no-value-for-parameter - rows = quota_classes.count().where( - quota_classes.c.class_name == 'default').execute().scalar() + rows = ( + quota_classes.count() # pylint: disable=no-value-for-parameter + .where(quota_classes.c.class_name == "default") + .execute() + .scalar() + ) - # Do not add entries if there are already 'default' entries. We don't - # want to write over something the user added. + # Do not add entries if there are already 'default' entries. We don't want to write + # over something the user added. if not rows: created_at = datetime.datetime.now() # Set default quota limits - qci = quota_classes.insert() # pylint: disable=E1120 + qci = quota_classes.insert() # pylint: disable=no-value-for-parameter for resource, default in CONF.dc_orch_global_limit.items(): - qci.execute({'created_at': created_at, - 'class_name': QUOTA_CLASS_NAME_DEFAULT, - 'resource': resource[6:], - 'hard_limit': default, - 'deleted': 0}) + qci.execute( + { + "created_at": created_at, + "class_name": QUOTA_CLASS_NAME_DEFAULT, + "resource": resource[6:], + "hard_limit": default, + "deleted": 0, + } + ) def downgrade(migrate_engine): - raise NotImplementedError('Database downgrade not supported - ' - 'would drop all tables') + raise NotImplementedError( + "Database downgrade not supported - would drop all tables" + ) diff --git a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/002_orch.py b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/002_orch.py index 803b5bb64..181da7e3d 100644 --- a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/002_orch.py +++ b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/002_orch.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017-2018 Wind River Inc. +# Copyright (c) 2017-2018, 2024 Wind River Inc. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -21,181 +21,165 @@ def upgrade(migrate_engine): meta.bind = migrate_engine subcloud = sqlalchemy.Table( - 'subcloud', meta, - sqlalchemy.Column('id', sqlalchemy.Integer, - primary_key=True, nullable=False), - sqlalchemy.Column('uuid', sqlalchemy.String(36), unique=True), - - sqlalchemy.Column('region_name', sqlalchemy.String(255), unique=True), - sqlalchemy.Column('software_version', sqlalchemy.String(255)), - - sqlalchemy.Column('management_state', sqlalchemy.String(64)), - sqlalchemy.Column('availability_status', sqlalchemy.String(64), - default="offline"), - sqlalchemy.Column('capabilities', sqlalchemy.Text), - - sqlalchemy.Column('created_at', sqlalchemy.DateTime), - sqlalchemy.Column('updated_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted', sqlalchemy.Integer), - - sqlalchemy.Index('subcloud_region_name_idx', 'region_name'), - - mysql_engine='InnoDB', - mysql_charset='utf8' + "subcloud", + meta, + sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, nullable=False), + sqlalchemy.Column("uuid", sqlalchemy.String(36), unique=True), + sqlalchemy.Column("region_name", sqlalchemy.String(255), unique=True), + sqlalchemy.Column("software_version", sqlalchemy.String(255)), + sqlalchemy.Column("management_state", sqlalchemy.String(64)), + sqlalchemy.Column( + "availability_status", sqlalchemy.String(64), default="offline" + ), + sqlalchemy.Column("capabilities", sqlalchemy.Text), + sqlalchemy.Column("created_at", sqlalchemy.DateTime), + sqlalchemy.Column("updated_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted", sqlalchemy.Integer), + sqlalchemy.Index("subcloud_region_name_idx", "region_name"), + mysql_engine="InnoDB", + mysql_charset="utf8", ) subcloud_alarms = sqlalchemy.Table( - 'subcloud_alarms', meta, - sqlalchemy.Column('id', sqlalchemy.Integer, - primary_key=True, nullable=False), - sqlalchemy.Column('uuid', sqlalchemy.String(36), unique=True), - - sqlalchemy.Column('region_name', sqlalchemy.String(255), unique=True), - sqlalchemy.Column('critical_alarms', sqlalchemy.Integer), - sqlalchemy.Column('major_alarms', sqlalchemy.Integer), - sqlalchemy.Column('minor_alarms', sqlalchemy.Integer), - sqlalchemy.Column('warnings', sqlalchemy.Integer), - sqlalchemy.Column('cloud_status', sqlalchemy.String(64)), - sqlalchemy.Column('capabilities', sqlalchemy.Text), - - sqlalchemy.Column('created_at', sqlalchemy.DateTime), - sqlalchemy.Column('updated_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted', sqlalchemy.Integer), - - sqlalchemy.Index('subcloud_alarm_region_name_idx', 'region_name'), - - mysql_engine='InnoDB', - mysql_charset='utf8' + "subcloud_alarms", + meta, + sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, nullable=False), + sqlalchemy.Column("uuid", sqlalchemy.String(36), unique=True), + sqlalchemy.Column("region_name", sqlalchemy.String(255), unique=True), + sqlalchemy.Column("critical_alarms", sqlalchemy.Integer), + sqlalchemy.Column("major_alarms", sqlalchemy.Integer), + sqlalchemy.Column("minor_alarms", sqlalchemy.Integer), + sqlalchemy.Column("warnings", sqlalchemy.Integer), + sqlalchemy.Column("cloud_status", sqlalchemy.String(64)), + sqlalchemy.Column("capabilities", sqlalchemy.Text), + sqlalchemy.Column("created_at", sqlalchemy.DateTime), + sqlalchemy.Column("updated_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted", sqlalchemy.Integer), + sqlalchemy.Index("subcloud_alarm_region_name_idx", "region_name"), + mysql_engine="InnoDB", + mysql_charset="utf8", ) resource = sqlalchemy.Table( - 'resource', meta, - sqlalchemy.Column('id', sqlalchemy.Integer, - primary_key=True, nullable=False), - sqlalchemy.Column('uuid', sqlalchemy.String(36), unique=True), - - sqlalchemy.Column('resource_type', sqlalchemy.String(128)), - sqlalchemy.Column('master_id', sqlalchemy.String(255)), - - sqlalchemy.Column('created_at', sqlalchemy.DateTime), - sqlalchemy.Column('updated_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted', sqlalchemy.Integer), - sqlalchemy.Column('capabilities', sqlalchemy.Text), - - sqlalchemy.Index('resource_resource_type_idx', 'resource_type'), - sqlalchemy.Index('resource_master_id_idx', 'master_id'), + "resource", + meta, + sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, nullable=False), + sqlalchemy.Column("uuid", sqlalchemy.String(36), unique=True), + sqlalchemy.Column("resource_type", sqlalchemy.String(128)), + sqlalchemy.Column("master_id", sqlalchemy.String(255)), + sqlalchemy.Column("created_at", sqlalchemy.DateTime), + sqlalchemy.Column("updated_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted", sqlalchemy.Integer), + sqlalchemy.Column("capabilities", sqlalchemy.Text), + sqlalchemy.Index("resource_resource_type_idx", "resource_type"), + sqlalchemy.Index("resource_master_id_idx", "master_id"), sqlalchemy.UniqueConstraint( - 'resource_type', 'master_id', 'deleted', - name='uniq_resource0resource_type0master_id0deleted'), - - mysql_engine='InnoDB', - mysql_charset='utf8' + "resource_type", + "master_id", + "deleted", + name="uniq_resource0resource_type0master_id0deleted", + ), + mysql_engine="InnoDB", + mysql_charset="utf8", ) subcloud_resource = sqlalchemy.Table( - 'subcloud_resource', meta, - sqlalchemy.Column('id', sqlalchemy.Integer, - primary_key=True, nullable=False), - sqlalchemy.Column('uuid', sqlalchemy.String(36), unique=True), - - sqlalchemy.Column('subcloud_resource_id', sqlalchemy.String(255)), - + "subcloud_resource", + meta, + sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, nullable=False), + sqlalchemy.Column("uuid", sqlalchemy.String(36), unique=True), + sqlalchemy.Column("subcloud_resource_id", sqlalchemy.String(255)), # Could have also gotten this from subcloud.region_name - sqlalchemy.Column('subcloud_name', sqlalchemy.String(255)), + sqlalchemy.Column("subcloud_name", sqlalchemy.String(255)), # Is this resource managed or unmanaged - sqlalchemy.Column('shared_config_state', sqlalchemy.String(64), - default="managed"), - sqlalchemy.Column('capabilities', sqlalchemy.Text), - - sqlalchemy.Column('resource_id', sqlalchemy.Integer, - sqlalchemy.ForeignKey('resource.id', - ondelete='CASCADE')), + sqlalchemy.Column( + "shared_config_state", sqlalchemy.String(64), default="managed" + ), + sqlalchemy.Column("capabilities", sqlalchemy.Text), + sqlalchemy.Column( + "resource_id", + sqlalchemy.Integer, + sqlalchemy.ForeignKey("resource.id", ondelete="CASCADE"), + ), # primary_key=True), - sqlalchemy.Column('subcloud_id', sqlalchemy.Integer, - sqlalchemy.ForeignKey('subcloud.id', - ondelete='CASCADE')), + sqlalchemy.Column( + "subcloud_id", + sqlalchemy.Integer, + sqlalchemy.ForeignKey("subcloud.id", ondelete="CASCADE"), + ), # primary_key=True), - - sqlalchemy.Column('created_at', sqlalchemy.DateTime), - sqlalchemy.Column('updated_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted', sqlalchemy.Integer), - - sqlalchemy.Index('subcloud_resource_resource_id_idx', 'resource_id'), + sqlalchemy.Column("created_at", sqlalchemy.DateTime), + sqlalchemy.Column("updated_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted", sqlalchemy.Integer), + sqlalchemy.Index("subcloud_resource_resource_id_idx", "resource_id"), sqlalchemy.UniqueConstraint( - 'resource_id', 'subcloud_id', - name='uniq_subcloud_resource0resource_id0subcloud_id'), - - mysql_engine='InnoDB', - mysql_charset='utf8' + "resource_id", + "subcloud_id", + name="uniq_subcloud_resource0resource_id0subcloud_id", + ), + mysql_engine="InnoDB", + mysql_charset="utf8", ) orch_job = sqlalchemy.Table( - 'orch_job', meta, - sqlalchemy.Column('id', sqlalchemy.Integer, - primary_key=True, nullable=False), - sqlalchemy.Column('uuid', sqlalchemy.String(36), unique=True), - - sqlalchemy.Column('user_id', sqlalchemy.String(128)), - sqlalchemy.Column('project_id', sqlalchemy.String(128)), - + "orch_job", + meta, + sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, nullable=False), + sqlalchemy.Column("uuid", sqlalchemy.String(36), unique=True), + sqlalchemy.Column("user_id", sqlalchemy.String(128)), + sqlalchemy.Column("project_id", sqlalchemy.String(128)), # filledin by x_orch_api - sqlalchemy.Column('endpoint_type', sqlalchemy.String(255), - nullable=False), + sqlalchemy.Column("endpoint_type", sqlalchemy.String(255), nullable=False), # sqlalchemy.Column('resource_type', sqlalchemy.String(255), # nullable=False), - - sqlalchemy.Column('source_resource_id', sqlalchemy.String(255)), + sqlalchemy.Column("source_resource_id", sqlalchemy.String(255)), # http type: e.g. post/put/patch/delete - sqlalchemy.Column('operation_type', sqlalchemy.String(255)), - - sqlalchemy.Column('resource_id', sqlalchemy.Integer, - sqlalchemy.ForeignKey('resource.id')), - - sqlalchemy.Column('resource_info', sqlalchemy.Text), - sqlalchemy.Column('capabilities', sqlalchemy.Text), - - sqlalchemy.Column('created_at', sqlalchemy.DateTime), - sqlalchemy.Column('updated_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted', sqlalchemy.Integer), - sqlalchemy.Index('orch_job_endpoint_type_idx', 'endpoint_type'), + sqlalchemy.Column("operation_type", sqlalchemy.String(255)), + sqlalchemy.Column( + "resource_id", sqlalchemy.Integer, sqlalchemy.ForeignKey("resource.id") + ), + sqlalchemy.Column("resource_info", sqlalchemy.Text), + sqlalchemy.Column("capabilities", sqlalchemy.Text), + sqlalchemy.Column("created_at", sqlalchemy.DateTime), + sqlalchemy.Column("updated_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted", sqlalchemy.Integer), + sqlalchemy.Index("orch_job_endpoint_type_idx", "endpoint_type"), # sqlalchemy.Index('orch_job_resource_type_idx', 'resource_type'), - - mysql_engine='InnoDB', - mysql_charset='utf8' + mysql_engine="InnoDB", + mysql_charset="utf8", ) orch_request = sqlalchemy.Table( - 'orch_request', meta, - sqlalchemy.Column('id', sqlalchemy.Integer, - primary_key=True, nullable=False), - sqlalchemy.Column('uuid', sqlalchemy.String(36), unique=True), - - sqlalchemy.Column('state', sqlalchemy.String(128)), - sqlalchemy.Column('try_count', sqlalchemy.Integer, default=0), - sqlalchemy.Column('api_version', sqlalchemy.String(128)), - sqlalchemy.Column('target_region_name', sqlalchemy.String(255)), - sqlalchemy.Column('capabilities', sqlalchemy.Text), - - sqlalchemy.Column('orch_job_id', sqlalchemy.Integer, - sqlalchemy.ForeignKey('orch_job.id')), - - sqlalchemy.Column('created_at', sqlalchemy.DateTime), - sqlalchemy.Column('updated_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted', sqlalchemy.Integer), - - sqlalchemy.Index('orch_request_idx', 'state'), + "orch_request", + meta, + sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, nullable=False), + sqlalchemy.Column("uuid", sqlalchemy.String(36), unique=True), + sqlalchemy.Column("state", sqlalchemy.String(128)), + sqlalchemy.Column("try_count", sqlalchemy.Integer, default=0), + sqlalchemy.Column("api_version", sqlalchemy.String(128)), + sqlalchemy.Column("target_region_name", sqlalchemy.String(255)), + sqlalchemy.Column("capabilities", sqlalchemy.Text), + sqlalchemy.Column( + "orch_job_id", sqlalchemy.Integer, sqlalchemy.ForeignKey("orch_job.id") + ), + sqlalchemy.Column("created_at", sqlalchemy.DateTime), + sqlalchemy.Column("updated_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted", sqlalchemy.Integer), + sqlalchemy.Index("orch_request_idx", "state"), sqlalchemy.UniqueConstraint( - 'target_region_name', 'orch_job_id', 'deleted', - name='uniq_orchreq0target_region_name0orch_job_id0deleted'), - - mysql_engine='InnoDB', - mysql_charset='utf8' + "target_region_name", + "orch_job_id", + "deleted", + name="uniq_orchreq0target_region_name0orch_job_id0deleted", + ), + mysql_engine="InnoDB", + mysql_charset="utf8", ) tables = ( @@ -204,7 +188,7 @@ def upgrade(migrate_engine): resource, subcloud_resource, orch_job, - orch_request + orch_request, ) for index, table in enumerate(tables): @@ -218,5 +202,6 @@ def upgrade(migrate_engine): def downgrade(migrate_engine): - raise NotImplementedError('Database downgrade not supported - ' - 'would drop all tables') + raise NotImplementedError( + "Database downgrade not supported - would drop all tables" + ) diff --git a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/003_initial_sync.py b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/003_initial_sync.py index 45d4f2219..c79ab35a4 100644 --- a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/003_initial_sync.py +++ b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/003_initial_sync.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020 Wind River Inc. +# Copyright (c) 2020, 2024 Wind River Inc. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -20,14 +20,15 @@ def upgrade(migrate_engine): meta = sqlalchemy.MetaData() meta.bind = migrate_engine - subcloud = sqlalchemy.Table('subcloud', meta, autoload=True) + subcloud = sqlalchemy.Table("subcloud", meta, autoload=True) # Add the initial_sync_state attribute - subcloud.create_column(sqlalchemy.Column('initial_sync_state', - sqlalchemy.String(64), - default="none")) + subcloud.create_column( + sqlalchemy.Column("initial_sync_state", sqlalchemy.String(64), default="none") + ) def downgrade(migrate_engine): - raise NotImplementedError('Database downgrade not supported - ' - 'would drop all tables') + raise NotImplementedError( + "Database downgrade not supported - would drop all tables" + ) diff --git a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/004_delete_subcloud_alarms.py b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/004_delete_subcloud_alarms.py index c5721a87d..80f315a60 100644 --- a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/004_delete_subcloud_alarms.py +++ b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/004_delete_subcloud_alarms.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020-2021 Wind River Systems, Inc. +# Copyright (c) 2020-2021, 2024 Wind River Systems, Inc. # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at @@ -19,10 +19,11 @@ def upgrade(migrate_engine): meta = sqlalchemy.MetaData() meta.bind = migrate_engine - subcloud_alarms = sqlalchemy.Table('subcloud_alarms', meta, autoload=True) + subcloud_alarms = sqlalchemy.Table("subcloud_alarms", meta, autoload=True) subcloud_alarms.drop() def downgrade(migrate_engine): - raise NotImplementedError('Database downgrade not supported - ' - 'would drop all tables') + raise NotImplementedError( + "Database downgrade not supported - would drop all tables" + ) diff --git a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/005_add_indices.py b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/005_add_indices.py index d30e7888a..263568e67 100644 --- a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/005_add_indices.py +++ b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/005_add_indices.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020 Wind River Inc. +# Copyright (c) 2020, 2024 Wind River Inc. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -15,19 +15,20 @@ from sqlalchemy import MetaData, Table, Index -ORCH_JOB_ID_INDEX_NAME = 'orch_request_orch_job_id_idx' -UPDATED_AT_STATE_INDEX_NAME = 'orch_request_updated_at_state_idx' -DELETED_AT_INDEX_NAME = 'orch_request_deleted_at_idx' +ORCH_JOB_ID_INDEX_NAME = "orch_request_orch_job_id_idx" +UPDATED_AT_STATE_INDEX_NAME = "orch_request_updated_at_state_idx" +DELETED_AT_INDEX_NAME = "orch_request_deleted_at_idx" def upgrade(migrate_engine): meta = MetaData() meta.bind = migrate_engine - orch_request = Table('orch_request', meta, autoload=True) + orch_request = Table("orch_request", meta, autoload=True) - index = Index(UPDATED_AT_STATE_INDEX_NAME, - orch_request.c.updated_at, orch_request.c.state) + index = Index( + UPDATED_AT_STATE_INDEX_NAME, orch_request.c.updated_at, orch_request.c.state + ) index.create(migrate_engine) index = Index(DELETED_AT_INDEX_NAME, orch_request.c.deleted_at) @@ -38,5 +39,6 @@ def upgrade(migrate_engine): def downgrade(migrate_engine): - raise NotImplementedError('Database downgrade not supported - ' - 'would drop all tables') + raise NotImplementedError( + "Database downgrade not supported - would drop all tables" + ) diff --git a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/006_sync_lock.py b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/006_sync_lock.py index b44dcf191..d1bb8e587 100644 --- a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/006_sync_lock.py +++ b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/006_sync_lock.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020 Wind River Inc. +# Copyright (c) 2020, 2024 Wind River Inc. # All Rights Reserved. # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain @@ -33,25 +33,26 @@ def upgrade(migrate_engine): meta.bind = migrate_engine sync_lock = sqlalchemy.Table( - 'sync_lock', meta, - sqlalchemy.Column('id', sqlalchemy.Integer, - primary_key=True, nullable=False), - sqlalchemy.Column('subcloud_name', sqlalchemy.String(length=255), - nullable=False), - sqlalchemy.Column('endpoint_type', sqlalchemy.String(255)), - sqlalchemy.Column('engine_id', sqlalchemy.String(length=36), - nullable=False), - sqlalchemy.Column('action', sqlalchemy.String(64)), - sqlalchemy.Column('created_at', sqlalchemy.DateTime), - sqlalchemy.Column('updated_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted', sqlalchemy.Integer), - + "sync_lock", + meta, + sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, nullable=False), + sqlalchemy.Column( + "subcloud_name", sqlalchemy.String(length=255), nullable=False + ), + sqlalchemy.Column("endpoint_type", sqlalchemy.String(255)), + sqlalchemy.Column("engine_id", sqlalchemy.String(length=36), nullable=False), + sqlalchemy.Column("action", sqlalchemy.String(64)), + sqlalchemy.Column("created_at", sqlalchemy.DateTime), + sqlalchemy.Column("updated_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted", sqlalchemy.Integer), sqlalchemy.UniqueConstraint( - 'subcloud_name', 'endpoint_type', 'action', - name='uniq_sync_lock0subcloud_name0endpoint_type0action'), - - mysql_engine='InnoDB', - mysql_charset='utf8' + "subcloud_name", + "endpoint_type", + "action", + name="uniq_sync_lock0subcloud_name0endpoint_type0action", + ), + mysql_engine="InnoDB", + mysql_charset="utf8", ) sync_lock.create() diff --git a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/007_subcloud_sync.py b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/007_subcloud_sync.py index e9c16e2f4..201c7124f 100644 --- a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/007_subcloud_sync.py +++ b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/007_subcloud_sync.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020 Wind River Inc. +# Copyright (c) 2020, 2024 Wind River Inc. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -21,40 +21,41 @@ def upgrade(migrate_engine): meta = sqlalchemy.MetaData() meta.bind = migrate_engine - sqlalchemy.Table('subcloud', meta, autoload=True) + sqlalchemy.Table("subcloud", meta, autoload=True) subcloud_sync = sqlalchemy.Table( - 'subcloud_sync', meta, - sqlalchemy.Column('id', sqlalchemy.Integer, - primary_key=True, nullable=False), - sqlalchemy.Column('subcloud_id', sqlalchemy.Integer, - sqlalchemy.ForeignKey('subcloud.id', - ondelete='CASCADE')), - sqlalchemy.Column('subcloud_name', sqlalchemy.String(255)), - sqlalchemy.Column('endpoint_type', sqlalchemy.String(255), - default="none"), - sqlalchemy.Column('sync_request', sqlalchemy.String(64), - default="none"), - sqlalchemy.Column('sync_status_reported', sqlalchemy.String(64), - default="none"), - sqlalchemy.Column('sync_status_report_time', sqlalchemy.DateTime), - sqlalchemy.Column('audit_status', sqlalchemy.String(64), - default="none"), - sqlalchemy.Column('last_audit_time', sqlalchemy.DateTime), - - sqlalchemy.Column('created_at', sqlalchemy.DateTime), - sqlalchemy.Column('updated_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted_at', sqlalchemy.DateTime), - sqlalchemy.Column('deleted', sqlalchemy.Integer), - - sqlalchemy.Index('subcloud_sync_subcloud_name_endpoint_type_idx', - 'subcloud_name', - 'endpoint_type'), + "subcloud_sync", + meta, + sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, nullable=False), + sqlalchemy.Column( + "subcloud_id", + sqlalchemy.Integer, + sqlalchemy.ForeignKey("subcloud.id", ondelete="CASCADE"), + ), + sqlalchemy.Column("subcloud_name", sqlalchemy.String(255)), + sqlalchemy.Column("endpoint_type", sqlalchemy.String(255), default="none"), + sqlalchemy.Column("sync_request", sqlalchemy.String(64), default="none"), + sqlalchemy.Column( + "sync_status_reported", sqlalchemy.String(64), default="none" + ), + sqlalchemy.Column("sync_status_report_time", sqlalchemy.DateTime), + sqlalchemy.Column("audit_status", sqlalchemy.String(64), default="none"), + sqlalchemy.Column("last_audit_time", sqlalchemy.DateTime), + sqlalchemy.Column("created_at", sqlalchemy.DateTime), + sqlalchemy.Column("updated_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted_at", sqlalchemy.DateTime), + sqlalchemy.Column("deleted", sqlalchemy.Integer), + sqlalchemy.Index( + "subcloud_sync_subcloud_name_endpoint_type_idx", + "subcloud_name", + "endpoint_type", + ), sqlalchemy.UniqueConstraint( - 'subcloud_name', 'endpoint_type', - name='uniq_subcloud_sync0subcloud_name0endpoint_type'), - - mysql_engine='InnoDB', - mysql_charset='utf8' + "subcloud_name", + "endpoint_type", + name="uniq_subcloud_sync0subcloud_name0endpoint_type", + ), + mysql_engine="InnoDB", + mysql_charset="utf8", ) subcloud_sync.create() diff --git a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/008_delete_sync_lock.py b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/008_delete_sync_lock.py index 12e8d9fe0..e2688fb9a 100644 --- a/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/008_delete_sync_lock.py +++ b/distributedcloud/dcorch/db/sqlalchemy/migrate_repo/versions/008_delete_sync_lock.py @@ -11,9 +11,9 @@ def upgrade(migrate_engine): meta = sqlalchemy.MetaData() meta.bind = migrate_engine - sync_lock = sqlalchemy.Table('sync_lock', meta, autoload=True) + sync_lock = sqlalchemy.Table("sync_lock", meta, autoload=True) sync_lock.drop() def downgrade(migrate_engine): - raise NotImplementedError('Database downgrade not supported.') + raise NotImplementedError("Database downgrade not supported.") diff --git a/distributedcloud/dcorch/db/sqlalchemy/migration.py b/distributedcloud/dcorch/db/sqlalchemy/migration.py index 168c47fcf..cee4b6433 100644 --- a/distributedcloud/dcorch/db/sqlalchemy/migration.py +++ b/distributedcloud/dcorch/db/sqlalchemy/migration.py @@ -1,4 +1,5 @@ # Copyright (c) 2015 Ericsson AB. +# Copyright (c) 2024 Wind River Systems, Inc. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -22,19 +23,15 @@ INIT_VERSION = 0 def db_sync(engine, version=None): - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), - 'migrate_repo') - return oslo_migration.db_sync(engine, path, version, - init_version=INIT_VERSION) + path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "migrate_repo") + return oslo_migration.db_sync(engine, path, version, init_version=INIT_VERSION) def db_version(engine): - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), - 'migrate_repo') + path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "migrate_repo") return oslo_migration.db_version(engine, path, INIT_VERSION) def db_version_control(engine, version=None): - path = os.path.join(os.path.abspath(os.path.dirname(__file__)), - 'migrate_repo') + path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "migrate_repo") return oslo_migration.db_version_control(engine, path, version) diff --git a/distributedcloud/dcorch/db/sqlalchemy/models.py b/distributedcloud/dcorch/db/sqlalchemy/models.py index c683c5eb2..f066de3ac 100644 --- a/distributedcloud/dcorch/db/sqlalchemy/models.py +++ b/distributedcloud/dcorch/db/sqlalchemy/models.py @@ -21,8 +21,7 @@ import json from oslo_db.sqlalchemy import models from sqlalchemy.orm import session as orm_session -from sqlalchemy import (Column, Integer, String, Boolean, Index, schema, - DateTime) +from sqlalchemy import Column, Integer, String, Boolean, Index, schema, DateTime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import ForeignKey, UniqueConstraint from sqlalchemy.types import TypeDecorator, VARCHAR @@ -56,12 +55,10 @@ class JSONEncodedDict(TypeDecorator): return value -class OrchestratorBase(models.ModelBase, - models.SoftDeleteMixin, - models.TimestampMixin): +class OrchestratorBase(models.ModelBase, models.SoftDeleteMixin, models.TimestampMixin): """Base class for Orchestrator Models.""" - __table_args__ = {'mysql_engine': 'InnoDB'} + __table_args__ = {"mysql_engine": "InnoDB"} def expire(self, session=None, attrs=None): if not session: @@ -99,12 +96,16 @@ class Quota(BASE, OrchestratorBase): Null, then the resource is unlimited. """ - __tablename__ = 'quotas' + __tablename__ = "quotas" __table_args__ = ( - schema.UniqueConstraint("project_id", "resource", "deleted", - name="uniq_quotas0project_id0resource0deleted" - ),) + schema.UniqueConstraint( + "project_id", + "resource", + "deleted", + name="uniq_quotas0project_id0resource0deleted", + ), + ) id = Column(Integer, primary_key=True) @@ -139,11 +140,11 @@ class QuotaClass(BASE, OrchestratorBase): class Service(BASE, OrchestratorBase): - """"Orchestrator service engine registry""" + """Orchestrator service engine registry""" - __tablename__ = 'service' + __tablename__ = "service" - id = Column('id', String(36), primary_key=True, nullable=False) + id = Column("id", String(36), primary_key=True, nullable=False) host = Column(String(255)) @@ -162,54 +163,59 @@ class Service(BASE, OrchestratorBase): class Subcloud(BASE, OrchestratorBase): """Represents a Distributed Cloud subcloud""" - __tablename__ = 'subcloud' - __table_args__ = ( - Index('subcloud_region_name_idx', 'region_name'), - ) + __tablename__ = "subcloud" + __table_args__ = (Index("subcloud_region_name_idx", "region_name"),) id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) uuid = Column(String(36), unique=True) - region_name = Column('region_name', String(255), unique=True) # keystone - software_version = Column('software_version', String(255)) + region_name = Column("region_name", String(255), unique=True) # keystone + software_version = Column("software_version", String(255)) # dc manager updates the management and availability # default management_state is None; could be set to 'deleting' - management_state = Column('management_state', String(64)) - availability_status = Column('availability_status', String(64), - default=dccommon_consts.AVAILABILITY_OFFLINE) + management_state = Column("management_state", String(64)) + availability_status = Column( + "availability_status", String(64), default=dccommon_consts.AVAILABILITY_OFFLINE + ) capabilities = Column(JSONEncodedDict) - initial_sync_state = Column('initial_sync_state', String(64), - default=consts.INITIAL_SYNC_STATE_NONE) - management_ip = Column('management_ip', String(64)) + initial_sync_state = Column( + "initial_sync_state", String(64), default=consts.INITIAL_SYNC_STATE_NONE + ) + management_ip = Column("management_ip", String(64)) class Resource(BASE, OrchestratorBase): """Represents a Distributed Cloud Orchestrator Resource""" - __tablename__ = 'resource' + __tablename__ = "resource" __table_args__ = ( - Index('resource_resource_type_idx', 'resource_type'), - Index('resource_master_id_idx', 'master_id'), + Index("resource_resource_type_idx", "resource_type"), + Index("resource_master_id_idx", "master_id"), UniqueConstraint( - 'resource_type', 'master_id', 'deleted', - name='uniq_resource0resource_type0master_id0deleted'), + "resource_type", + "master_id", + "deleted", + name="uniq_resource0resource_type0master_id0deleted", + ), ) id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) uuid = Column(String(36), unique=True) capabilities = Column(JSONEncodedDict) resource_type = Column(String(128)) # e.g. quota_x,flavor_extra_spec,dns.. - master_id = Column(String(255)) # id/uuid of resource in central region + master_id = Column(String(255)) # id/uuid of resource in central region class SubcloudResource(BASE, OrchestratorBase): """Represents a Distributed Cloud Orchestrator Subcloud Resource""" - __tablename__ = 'subcloud_resource' + __tablename__ = "subcloud_resource" __table_args__ = ( - Index('subcloud_resource_resource_id_idx', 'resource_id'), + Index("subcloud_resource_resource_id_idx", "resource_id"), UniqueConstraint( - 'resource_id', 'subcloud_id', - name='uniq_subcloud_resource0resource_id0subcloud_id'), + "resource_id", + "subcloud_id", + name="uniq_subcloud_resource0resource_id0subcloud_id", + ), ) id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) @@ -218,18 +224,19 @@ class SubcloudResource(BASE, OrchestratorBase): # Could get subcloud_name (or target_region) from subcloud.region_name # subcloud_name = Column('subcloud_name', String(255)) # Is this resource managed or unmanaged by orchestrator for some subcloud - shared_config_state = Column('shared_config_state', String(255), - default="managed") + shared_config_state = Column("shared_config_state", String(255), default="managed") capabilities = Column(JSONEncodedDict) subcloud_resource_id = Column(String(255)) # usually uuid, sometimes id # if either resource_id or subcloud_id is set as primary key, id does not # autoincrement - resource_id = Column('resource_id', Integer, - ForeignKey('resource.id', ondelete='CASCADE')) + resource_id = Column( + "resource_id", Integer, ForeignKey("resource.id", ondelete="CASCADE") + ) - subcloud_id = Column('subcloud_id', Integer, - ForeignKey('subcloud.id', ondelete='CASCADE')) + subcloud_id = Column( + "subcloud_id", Integer, ForeignKey("subcloud.id", ondelete="CASCADE") + ) # todo: we shouldn't allow more than one row to have the same # resource_id/subcloud_id tuple @@ -237,16 +244,14 @@ class SubcloudResource(BASE, OrchestratorBase): class OrchJob(BASE, OrchestratorBase): """Orchestrator Job registry""" - __tablename__ = 'orch_job' - __table_args__ = ( - Index('orch_job_endpoint_type_idx', 'endpoint_type'), - ) + __tablename__ = "orch_job" + __table_args__ = (Index("orch_job_endpoint_type_idx", "endpoint_type"),) id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) uuid = Column(String(36), unique=True) - user_id = Column('user_id', String(128)) - project_id = Column('project_id', String(128)) + user_id = Column("user_id", String(128)) + project_id = Column("project_id", String(128)) # Filled in by x_orch_api e.g. platform, volumev2, compute, network endpoint_type = Column(String(255), nullable=False) @@ -256,8 +261,9 @@ class OrchJob(BASE, OrchestratorBase): operation_type = Column(String(255)) # http type: post/put/patch/delete capabilities = Column(JSONEncodedDict) - resource_id = Column('resource_id', Integer, - ForeignKey('resource.id')) # nullable=False? + resource_id = Column( + "resource_id", Integer, ForeignKey("resource.id") + ) # nullable=False? # resource_info cannot be derived from resource.master_values # Represents resource info for a specific API call. In case of update, it @@ -267,17 +273,20 @@ class OrchJob(BASE, OrchestratorBase): # formatted dict. The exact contents will vary depending on resource. resource_info = Column(String()) - orchrequests = relationship('OrchRequest', backref='orch_job') + orchrequests = relationship("OrchRequest", backref="orch_job") # orch_status can be derived from the underlying OrchRequests state class OrchRequest(BASE, OrchestratorBase): - __tablename__ = 'orch_request' + __tablename__ = "orch_request" __table_args__ = ( - Index('orch_request_state_idx', 'state'), + Index("orch_request_state_idx", "state"), UniqueConstraint( - 'target_region_name', 'orch_job_id', 'deleted', - name='uniq_orchreq0target_region_name0orch_job_id0deleted'), + "target_region_name", + "orch_job_id", + "deleted", + name="uniq_orchreq0target_region_name0orch_job_id0deleted", + ), ) id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) @@ -292,20 +301,20 @@ class OrchRequest(BASE, OrchestratorBase): target_region_name = Column(String(255)) capabilities = Column(JSONEncodedDict) - orch_job_id = Column('orch_job_id', Integer, - ForeignKey('orch_job.id'), primary_key=True) + orch_job_id = Column( + "orch_job_id", Integer, ForeignKey("orch_job.id"), primary_key=True + ) class SubcloudSync(BASE, OrchestratorBase): - """Store subcloud sync information to allow coordination of dcorch workload + """Store subcloud sync information to allow coordination of dcorch workload""" - """ - - __tablename__ = 'subcloud_sync' + __tablename__ = "subcloud_sync" id = Column(Integer, primary_key=True) - subcloud_id = Column('subcloud_id', Integer, - ForeignKey('subcloud.id', ondelete='CASCADE')) + subcloud_id = Column( + "subcloud_id", Integer, ForeignKey("subcloud.id", ondelete="CASCADE") + ) subcloud_name = Column(String(255), nullable=False) endpoint_type = Column(String(255), default="none") sync_request = Column(String(64), default=consts.SYNC_STATUS_NONE) diff --git a/distributedcloud/dcorch/db/utils.py b/distributedcloud/dcorch/db/utils.py index 40c7e0cc2..1a77d76ed 100644 --- a/distributedcloud/dcorch/db/utils.py +++ b/distributedcloud/dcorch/db/utils.py @@ -1,5 +1,5 @@ # Copyright (c) 2015 Ericsson AB. -# Copyright (c) 2020-2022 Wind River Systems, Inc. +# Copyright (c) 2020-2022, 2024 Wind River Systems, Inc. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -46,8 +46,8 @@ class LazyPluggable(object): return getattr(backend, key) -IMPL = LazyPluggable('backend', sqlalchemy='dcorch.db.sqlalchemy.api') +IMPL = LazyPluggable("backend", sqlalchemy="dcorch.db.sqlalchemy.api") -def purge_deleted(age, granularity='days'): +def purge_deleted(age, granularity="days"): IMPL.purge_deleted(age, granularity) diff --git a/distributedcloud/run_black.py b/distributedcloud/run_black.py index c17a15a9f..bbfca32c0 100644 --- a/distributedcloud/run_black.py +++ b/distributedcloud/run_black.py @@ -27,6 +27,7 @@ formatted_modules = [ "dcdbsync", "dcorch/api", "dcorch/common", + "dcorch/db", ]