Ejemplo n.º 1
0
 def __init__(self, flavor=None, context=None, flavor_id=None):
     if flavor:
         self.flavor = flavor
         return
     if flavor_id and context:
         try:
             client = create_nova_client(context)
             self.flavor = client.flavors.get(flavor_id)
         except nova_exceptions.NotFound as e:
             raise exception.NotFound(uuid=flavor_id)
         except nova_exceptions.ClientException as e:
             raise exception.TroveError(str(e))
         return
     msg = ("Flavor is not defined, and"
            " context and flavor_id were not specified.")
     raise exception.InvalidModelError(errors=msg)
Ejemplo n.º 2
0
 def find_server(instance_id, server_id):
     matches = [server for server in server_list if server.id == server_id]
     if len(matches) == 1:
         return matches[0]
     elif len(matches) < 1:
         # The instance was not found in the list and
         # this can happen if the instance is deleted from
         # nova but still in trove database
         raise exception.ComputeInstanceNotFound(
             instance_id=instance_id, server_id=server_id)
     else:
         # Should never happen, but never say never.
         LOG.error(_("Server %(server)s for instance %(instance)s was "
                     "found twice!") % {'server': server_id,
                                        'instance': instance_id})
         raise exception.TroveError(uuid=instance_id)
Ejemplo n.º 3
0
    def detach_slave(self, service, for_failover):
        """Promote replica and wait for its running.

        Running on replica, detach from the primary.
        """
        service.adm.query("select pg_promote()")

        def _wait_for_failover():
            """Wait until slave has switched out of recovery mode"""
            return not service.is_replica()

        try:
            utils.poll_until(_wait_for_failover, time_out=60)
        except exception.PollTimeOut:
            raise exception.TroveError(
                "Timeout occurred waiting for replica to exit standby mode")
Ejemplo n.º 4
0
    def _parse_grow_item(self, item):
        used_keys = []

        def _check_option(key, required=False, valid_values=None):
            if required and key not in item:
                raise exception.TroveError(
                    _('An instance with the options %(given)s is missing '
                      'the MongoDB required option %(expected)s.')
                    % {'given': item.keys(), 'expected': key}
                )
            value = item.get(key, None)
            if valid_values and value not in valid_values:
                raise exception.TroveError(
                    _('The value %(value)s for key %(key)s is invalid. '
                      'Allowed values are %(valid)s.')
                    % {'value': value, 'key': key, 'valid': valid_values}
                )
            used_keys.append(key)
            return value

        flavor_id = utils.get_id_from_href(_check_option('flavorRef',
                                                         required=True))
        volume_size = int(_check_option('volume', required=True)['size'])
        instance_type = _check_option('type', required=True,
                                      valid_values=['replica',
                                                    'query_router'])
        name = _check_option('name')
        related_to = _check_option('related_to')

        unused_keys = list(set(item.keys()).difference(set(used_keys)))
        if unused_keys:
            raise exception.TroveError(
                _('The arguments %s are not supported by MongoDB.')
                % unused_keys
            )

        instance = {'flavor_id': flavor_id,
                    'volume_size': volume_size,
                    'instance_type': instance_type}
        if name:
            instance['name'] = name
        if related_to:
            instance['related_to'] = related_to
        return instance
Ejemplo n.º 5
0
    def perform_restore(self, context, restore_location, backup_info):
        LOG.info(
            "Starting to restore database from backup %s, "
            "backup_info: %s", backup_info['id'], backup_info)

        if (backup_info["location"].endswith('.enc')
                and not CONF.backup_aes_cbc_key):
            self.status.set_status(service_status.ServiceStatuses.FAILED)
            raise exception.TroveError('Decryption key not configured for '
                                       'encrypted backup.')

        try:
            self.app.restore_backup(context, backup_info, restore_location)
        except Exception:
            LOG.error("Failed to restore from backup %s.", backup_info['id'])
            self.status.set_status(service_status.ServiceStatuses.FAILED)
            raise

        LOG.info("Finished restore data from backup %s", backup_info['id'])
Ejemplo n.º 6
0
 def _get_subnets(self):
     public_subnet_name = rac_utils.make_object_name(
         self.ds_conf, ['public', 'subnet'], self.id)
     interconnect_subnet_name = rac_utils.make_object_name(
         self.ds_conf, ['interconnect', 'subnet'], self.id)
     subnets = self.network_driver.list_subnets()
     self.pub_subnet = None
     self.int_subnet = None
     for subnet in subnets:
         if subnet['name'] == public_subnet_name:
             self.pub_subnet = subnet
         elif subnet['name'] == interconnect_subnet_name:
             self.int_subnet = subnet
     if not self.pub_subnet and self.int_subnet:
         raise exception.TroveError(
             _("Could not find cluster's public and interconnect subnets."))
     LOG.debug("Cluster {clu} is using public subnet {pubsub} and "
               "interconnect subnet {intsub}".format(
                   clu=self.id,
                   pubsub=self.pub_subnet['cidr'],
                   intsub=self.int_subnet['cidr']))
Ejemplo n.º 7
0
    def __init__(self, volume_type=None, context=None, volume_type_id=None):
        """
        Initialize the volume type either from the volume_type parameter, or
        by querying cinder using the context provided.
        """

        if volume_type and not (volume_type_id or context):
            self.volume_type = volume_type
        elif volume_type_id and context:
            try:
                client = create_cinder_client(context)
                self.volume_type = client.volume_types.get(volume_type_id)
            except cinder_exception.NotFound:
                raise trove_exception.NotFound(uuid=volume_type_id)
            except cinder_exception.ClientException as ce:
                raise trove_exception.TroveError(str(ce))

            return
        else:
            raise trove_exception.InvalidModelError(
                errors="An invalid set of arguments were provided.")
Ejemplo n.º 8
0
def load_server(context, instance_id, server_id):
    """
    Loads a server or raises an exception.
    :param context: request context used to access nova
    :param instance_id: the trove instance id corresponding to the nova server
    (informational only)
    :param server_id: the compute instance id which will be retrieved from nova
    :type context: trove.common.context.TroveContext
    :type instance_id: unicode
    :type server_id: unicode
    :rtype: novaclient.v1_1.servers.Server
    """
    client = create_nova_client(context)
    try:
        server = client.servers.get(server_id)
    except nova_exceptions.NotFound:
        LOG.error(_LE("Could not find nova server_id(%s)."), server_id)
        raise exception.ComputeInstanceNotFound(instance_id=instance_id,
                                                server_id=server_id)
    except nova_exceptions.ClientException as e:
        raise exception.TroveError(str(e))
    return server
Ejemplo n.º 9
0
 def enable_root(self, root_password=None):
     """Enable the sys user global access and/or
        reset the sys password.
     """
     LOG.debug("Enabling root.")
     if self.database_open_mode.startswith('READ ONLY'):
         raise exception.TroveError(
             _("Cannot root enable a read only database."))
     if not root_password:
         root_password = new_oracle_password()
     with self.cursor(self.database_name) as cursor:
         cursor.execute(
             str(
                 sql_query.AlterUser.change_password(
                     self.root_user_name, root_password)))
     self.ora_config.enable_root()
     self.ora_config.root_password = root_password
     user = models.RootUser()
     user.name = self.root_user_name
     user.host = '%'
     user.password = root_password
     LOG.debug("Successfully enabled root.")
     return user.serialize()
Ejemplo n.º 10
0
 def action(self, req, body, tenant_id, id):
     LOG.debug("Committing Action Against Cluster for "
               "Tenant '%s'" % tenant_id)
     LOG.info(_("req : '%s'\n\n") % req)
     LOG.info(_("id : '%s'\n\n") % id)
     if not body:
         raise exception.BadRequest(_("Invalid request body."))
     context = req.environ[wsgi.CONTEXT_KEY]
     cluster = models.Cluster.load(context, id)
     manager = cluster.datastore_version.manager
     api_strategy = strategy.load_api_strategy(manager)
     _actions = api_strategy.cluster_controller_actions
     selected_action = None
     for key in body:
         if key in _actions:
             selected_action = _actions[key]
             break
     else:
         message = _("No action '%(action)s' supplied "
                     "by strategy for manager '%(manager)s'") % (
                         {'action': key, 'manager': manager})
         raise exception.TroveError(message)
     return selected_action(cluster, body)
Ejemplo n.º 11
0
    def _instance_root_delete(self, req, instance_id, slave_instances=None):
        LOG.info("Disabling authentication for instance '%s'.", instance_id)
        LOG.info("req : '%s'\n\n", req)
        context = req.environ[wsgi.CONTEXT_KEY]

        is_root_enabled = RedisRoot.load(context, instance_id)
        if not is_root_enabled:
            raise exception.RootHistoryNotFound()

        original_auth_password = self._get_original_auth_password(
            context, instance_id)

        # Do root-disable and roll back once if operation fails.
        try:
            RedisRoot.delete(context, instance_id)
        except exception.TroveError:
            self._rollback_once(req, instance_id, original_auth_password)
            raise exception.TroveError(
                _("Failed to do root-disable for instance "
                  "'%(instance_id)s'.") % {'instance_id': instance_id})

        failed_slaves = []
        for slave_id in slave_instances:
            try:
                LOG.info(
                    "Disabling authentication for slave instance "
                    "'%s'.", slave_id)
                RedisRoot.delete(context, slave_id)
            except exception.TroveError:
                failed_slaves.append(slave_id)

        if len(failed_slaves) > 0:
            result = {'failed_slaves': failed_slaves}
            return wsgi.Result(result, 200)

        return wsgi.Result(None, 204)
Ejemplo n.º 12
0
 def apply_overrides(self, context, overrides):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 13
0
 def update_overrides(self, context, overrides, remove=False):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 14
0
 def create_backup(self, context, backup_info):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 15
0
 def _perform_restore(self, backup_info, context, restore_location, app):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 16
0
 def is_root_enabled(self, context):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 17
0
 def enable_root(self, context):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 18
0
 def list_users(self,
                context,
                limit=None,
                marker=None,
                include_marker=False):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 19
0
 def list_access(self, context, username, hostname):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 20
0
 def change_passwords(self, context, users):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 21
0
 def _get_node_details(self):
     for node_details in self._get_node_info():
         if 'myself' in node_details[2]:
             return node_details
     raise exception.TroveError(_("Unable to determine node details"))
Ejemplo n.º 22
0
 def delete_user(self, context, user):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 23
0
 def delete_database(self, context, database):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 24
0
 def create_user(self, context, users):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 25
0
 def create_database(self, context, databases):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 26
0
    def shrink(self, instance_ids):
        """Removes instances from a cluster.
        Currently only supports removing entire replica sets from the cluster.
        """
        if not len(instance_ids) > 0:
            raise exception.TroveError(
                _('No instances specified for shrink operation.'))

        self._prep_resize()

        all_member_ids = set([member.id for member in self.members])
        all_query_router_ids = set(
            [query_router.id for query_router in self.query_routers])
        target_ids = set(instance_ids)
        target_member_ids = target_ids.intersection(all_member_ids)
        target_query_router_ids = target_ids.intersection(all_query_router_ids)
        target_configsvr_ids = target_ids.difference(
            target_member_ids.union(target_query_router_ids))
        if target_configsvr_ids:
            raise exception.ClusterShrinkInstanceInUse(
                id=list(target_configsvr_ids),
                reason="Cannot remove config servers.")

        remaining_query_router_ids = all_query_router_ids.difference(
            target_query_router_ids)
        if len(remaining_query_router_ids) < 1:
            raise exception.ClusterShrinkInstanceInUse(
                id=list(target_query_router_ids),
                reason="Cannot remove all remaining query routers. At least "
                "one query router must be available in the cluster.")

        if target_member_ids:
            target_members = [
                member for member in self.members
                if member.id in target_member_ids
            ]
            target_shards = {}
            for member in target_members:
                if member.shard_id in target_shards:
                    target_shards[member.shard_id].append(member.id)
                else:
                    target_shards[member.shard_id] = [member.id]
            for target_shard_id in target_shards.keys():
                # check the whole shard is being deleted
                target_shard_member_ids = [
                    member.id for member in target_members
                    if member.shard_id == target_shard_id
                ]
                all_shard_member_ids = [
                    member.id for member in self.members
                    if member.shard_id == target_shard_id
                ]
                if set(target_shard_member_ids) != set(all_shard_member_ids):
                    raise exception.TroveError(
                        _('MongoDB cluster shrink only supports removing an '
                          'entire shard. Shard %(shard)s has members: '
                          '%(instances)s') % {
                              'shard': target_shard_id,
                              'instances': all_shard_member_ids
                          })
                self._check_shard_status(target_shard_member_ids[0])

        # all checks are done by now
        self.update_db(task_status=ClusterTasks.SHRINKING_CLUSTER)
        for instance_id in instance_ids:
            instance = inst_models.load_any_instance(self.context, instance_id)
            instance.delete()
        self.manager.shrink_cluster(self.id, instance_ids)
Ejemplo n.º 27
0
 def update_attributes(self, context, username, hostname, user_attrs):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 28
0
 def grant_access(self, context, username, hostname, databases):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 29
0
 def get_user(self, context, username, hostname):
     raise exception.TroveError(ERROR_MSG)
Ejemplo n.º 30
0
 def revoke_access(self, context, username, hostname, database):
     raise exception.TroveError(ERROR_MSG)