def _validate_update_body(self, id, context, body): replica = self._replica_api.get_replica(context, id) try: merged_body = self._get_merged_replica_values( replica, body['replica']) origin_endpoint_id = replica["origin_endpoint_id"] destination_endpoint_id = replica["destination_endpoint_id"] self._endpoints_api.validate_source_environment( context, origin_endpoint_id, merged_body["source_environment"]) destination_environment = merged_body["destination_environment"] self._endpoints_api.validate_target_environment( context, destination_endpoint_id, destination_environment) api_utils.validate_network_map(merged_body["network_map"]) api_utils.validate_storage_mappings( merged_body["storage_mappings"]) return merged_body except Exception as ex: LOG.exception(ex) raise exception.InvalidInput(getattr(ex, "message", str(ex)))
def _validate_create_body(self, context, body): replica = body["replica"] origin_endpoint_id = replica["origin_endpoint_id"] destination_endpoint_id = replica["destination_endpoint_id"] destination_environment = replica.get("destination_environment", {}) instances = api_utils.validate_instances_list_for_transfer( replica.get('instances')) notes = replica.get("notes") source_environment = replica.get("source_environment", {}) self._endpoints_api.validate_source_environment( context, origin_endpoint_id, source_environment) origin_minion_pool_id = replica.get('origin_minion_pool_id') destination_minion_pool_id = replica.get('destination_minion_pool_id') instance_osmorphing_minion_pool_mappings = replica.get( 'instance_osmorphing_minion_pool_mappings', {}) extras = [ instance for instance in instance_osmorphing_minion_pool_mappings if instance not in instances ] if extras: raise ValueError( "One or more instance OSMorphing pool mappings were " "provided for instances (%s) which are not part of the " "Replicas's declared instances (%s)" % (extras, instances)) # TODO(aznashwan): until the provider plugin interface is updated # to have separate 'network_map' and 'storage_mappings' fields, # we add them as part of the destination environment: network_map = replica.get("network_map", {}) api_utils.validate_network_map(network_map) destination_environment['network_map'] = network_map self._endpoints_api.validate_target_environment( context, destination_endpoint_id, destination_environment) user_scripts = replica.get('user_scripts', {}) api_utils.validate_user_scripts(user_scripts) user_scripts = api_utils.normalize_user_scripts( user_scripts, instances) # NOTE(aznashwan): we validate the destination environment for the # import provider before appending the 'storage_mappings' parameter # for plugins with strict property name checks which do not yet # support storage mapping features: storage_mappings = replica.get("storage_mappings", {}) api_utils.validate_storage_mappings(storage_mappings) destination_environment['storage_mappings'] = storage_mappings return (origin_endpoint_id, destination_endpoint_id, source_environment, destination_environment, instances, network_map, storage_mappings, notes, origin_minion_pool_id, destination_minion_pool_id, instance_osmorphing_minion_pool_mappings, user_scripts)
def _validate_migration_input(self, context, migration): try: origin_endpoint_id = migration["origin_endpoint_id"] destination_endpoint_id = migration["destination_endpoint_id"] origin_minion_pool_id = migration.get('origin_minion_pool_id') destination_minion_pool_id = migration.get( 'destination_minion_pool_id') instance_osmorphing_minion_pool_mappings = migration.get( 'instance_osmorphing_minion_pool_mappings', {}) destination_environment = migration.get("destination_environment", {}) instances = migration["instances"] notes = migration.get("notes") skip_os_morphing = migration.get("skip_os_morphing", False) shutdown_instances = migration.get("shutdown_instances", False) replication_count = int(migration.get("replication_count", 2)) if replication_count not in range(1, 11): raise ValueError( "'replication_count' must be an integer between 1 and 10." " Got: %s" % replication_count) source_environment = migration.get("source_environment", {}) self._endpoints_api.validate_source_environment( context, origin_endpoint_id, source_environment) network_map = migration.get("network_map", {}) api_utils.validate_network_map(network_map) destination_environment['network_map'] = network_map # NOTE(aznashwan): we validate the destination environment for the # import provider before appending the 'storage_mappings' parameter # for plugins with strict property name checks which do not yet # support storage mapping features: self._endpoints_api.validate_target_environment( context, destination_endpoint_id, destination_environment) # TODO(aznashwan): until the provider plugin interface is updated # to have separate 'network_map' and 'storage_mappings' fields, # we add them as part of the destination environment: storage_mappings = migration.get("storage_mappings", {}) api_utils.validate_storage_mappings(storage_mappings) destination_environment['storage_mappings'] = storage_mappings return (origin_endpoint_id, destination_endpoint_id, origin_minion_pool_id, destination_minion_pool_id, instance_osmorphing_minion_pool_mappings, source_environment, destination_environment, instances, notes, skip_os_morphing, replication_count, shutdown_instances, network_map, storage_mappings) except Exception as ex: LOG.exception(ex) msg = getattr(ex, "message", str(ex)) raise exception.InvalidInput(msg)
def _validate_update_body(self, id, context, body): replica = self._replica_api.get_replica(context, id) replica_body = body['replica'] origin_endpoint_id = replica_body.get('origin_endpoint_id', None) destination_endpoint_id = replica_body.get('destination_endpoint_id', None) instances = body['replica'].get('instances', None) if origin_endpoint_id or destination_endpoint_id: raise exc.HTTPBadRequest( explanation="The source or destination endpoints for a " "Coriolis Replica cannot be updated after its " "creation. If the credentials of any of the " "Replica's endpoints need updating, please update " "the endpoints themselves.") if instances: raise exc.HTTPBadRequest( explanation="The list of instances of a Replica cannot be " "updated") merged_body = self._get_merged_replica_values(replica, replica_body) replica_origin_endpoint_id = replica["origin_endpoint_id"] replica_destination_endpoint_id = replica["destination_endpoint_id"] self._endpoints_api.validate_source_environment( context, replica_origin_endpoint_id, merged_body["source_environment"]) destination_environment = merged_body["destination_environment"] self._endpoints_api.validate_target_environment( context, replica_destination_endpoint_id, destination_environment) api_utils.validate_network_map(merged_body["network_map"]) api_utils.validate_storage_mappings(merged_body["storage_mappings"]) user_scripts = merged_body['user_scripts'] api_utils.validate_user_scripts(user_scripts) merged_body['user_scripts'] = api_utils.normalize_user_scripts( user_scripts, replica.get('instances', [])) return merged_body
def _validate_create_body(self, context, body): try: replica = body["replica"] origin_endpoint_id = replica["origin_endpoint_id"] destination_endpoint_id = replica["destination_endpoint_id"] destination_environment = replica.get("destination_environment", {}) instances = replica["instances"] notes = replica.get("notes") source_environment = replica.get("source_environment", {}) self._endpoints_api.validate_source_environment( context, origin_endpoint_id, source_environment) network_map = replica.get("network_map", {}) api_utils.validate_network_map(network_map) destination_environment['network_map'] = network_map # NOTE(aznashwan): we validate the destination environment for the # import provider before appending the 'storage_mappings' parameter # for plugins with strict property name checks which do not yet # support storage mapping features: self._endpoints_api.validate_target_environment( context, destination_endpoint_id, destination_environment) storage_mappings = replica.get("storage_mappings", {}) api_utils.validate_storage_mappings(storage_mappings) # TODO(aznashwan): until the provider plugin interface is updated # to have separate 'network_map' and 'storage_mappings' fields, # we add them as part of the destination environment: destination_environment['storage_mappings'] = storage_mappings return (origin_endpoint_id, destination_endpoint_id, source_environment, destination_environment, instances, network_map, storage_mappings, notes) except Exception as ex: LOG.exception(ex) msg = getattr(ex, "message", str(ex)) raise exception.InvalidInput(msg)
def _validate_migration_input(self, context, body): migration = body["migration"] origin_endpoint_id = migration["origin_endpoint_id"] destination_endpoint_id = migration["destination_endpoint_id"] origin_minion_pool_id = migration.get('origin_minion_pool_id') destination_minion_pool_id = migration.get( 'destination_minion_pool_id') instance_osmorphing_minion_pool_mappings = migration.get( 'instance_osmorphing_minion_pool_mappings', {}) instances = api_utils.validate_instances_list_for_transfer( migration.get('instances')) extras = [ instance for instance in instance_osmorphing_minion_pool_mappings if instance not in instances] if extras: raise ValueError( "One or more instance OSMorphing pool mappings were " "provided for instances (%s) which are not part of the " "migration's declared instances (%s)" % (extras, instances)) notes = migration.get("notes") skip_os_morphing = migration.get("skip_os_morphing", False) shutdown_instances = migration.get( "shutdown_instances", False) replication_count = int(migration.get("replication_count", 2)) if replication_count not in range(1, 11): raise ValueError( "'replication_count' must be an integer between 1 and 10." " Got: %s" % replication_count) source_environment = migration.get("source_environment", {}) self._endpoints_api.validate_source_environment( context, origin_endpoint_id, source_environment) network_map = migration.get("network_map", {}) api_utils.validate_network_map(network_map) # TODO(aznashwan): until the provider plugin interface is updated # to have separate 'network_map' and 'storage_mappings' fields, # we add them as part of the destination environment: destination_environment = migration.get( "destination_environment", {}) destination_environment['network_map'] = network_map self._endpoints_api.validate_target_environment( context, destination_endpoint_id, destination_environment) storage_mappings = migration.get("storage_mappings", {}) api_utils.validate_storage_mappings(storage_mappings) # NOTE(aznashwan): we validate the destination environment for the # import provider before appending the 'storage_mappings' parameter # for plugins with strict property name checks which do not yet # support storage mapping features: destination_environment['storage_mappings'] = storage_mappings return (origin_endpoint_id, destination_endpoint_id, origin_minion_pool_id, destination_minion_pool_id, instance_osmorphing_minion_pool_mappings, source_environment, destination_environment, instances, notes, skip_os_morphing, replication_count, shutdown_instances, network_map, storage_mappings)