Beispiel #1
0
    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)))
Beispiel #2
0
    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)
Beispiel #3
0
    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)
Beispiel #4
0
    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
Beispiel #5
0
    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)
Beispiel #6
0
    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)