okozachenko1203 | ef49f95 | 2022-05-16 22:27:28 +1000 | [diff] [blame] | 1 | from openstack import exceptions, proxy
|
okozachenko1203 | 5fd8a30 | 2022-04-07 01:55:29 +1000 | [diff] [blame] | 2 | from oslo_log import log
|
ricolin | f796ea8 | 2025-03-14 23:18:14 +0800 | [diff] [blame^] | 3 |
|
okozachenko | 2ab48e8 | 2021-05-07 16:55:11 +0300 | [diff] [blame] | 4 | from staffeln.common import auth
|
okozachenko1203 | 5fd8a30 | 2022-04-07 01:55:29 +1000 | [diff] [blame] | 5 | from staffeln.i18n import _
|
| 6 |
|
| 7 | LOG = log.getLogger(__name__)
|
okozachenko | 2ab48e8 | 2021-05-07 16:55:11 +0300 | [diff] [blame] | 8 |
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 9 |
|
okozachenko1203 | fa747f2 | 2022-05-16 20:13:54 +1000 | [diff] [blame] | 10 | class OpenstackSDK:
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 11 | def __init__(self):
|
| 12 | self.conn_list = {}
|
| 13 | self.conn = auth.create_connection()
|
okozachenko | 2ab48e8 | 2021-05-07 16:55:11 +0300 | [diff] [blame] | 14 |
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 15 | def set_project(self, project):
|
okozachenko1203 | fa747f2 | 2022-05-16 20:13:54 +1000 | [diff] [blame] | 16 | LOG.debug(_("Connect as project %s" % project.get("name")))
|
| 17 | project_id = project.get("id")
|
okozachenko | 2ab48e8 | 2021-05-07 16:55:11 +0300 | [diff] [blame] | 18 |
|
okozachenko1203 | 5fd8a30 | 2022-04-07 01:55:29 +1000 | [diff] [blame] | 19 | if project_id not in self.conn_list:
|
okozachenko1203 | fa747f2 | 2022-05-16 20:13:54 +1000 | [diff] [blame] | 20 | LOG.debug(_("Initiate connection for project %s" % project.get("name")))
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 21 | conn = self.conn.connect_as_project(project)
|
okozachenko1203 | 5fd8a30 | 2022-04-07 01:55:29 +1000 | [diff] [blame] | 22 | self.conn_list[project_id] = conn
|
okozachenko1203 | fa747f2 | 2022-05-16 20:13:54 +1000 | [diff] [blame] | 23 | LOG.debug(_("Connect as project %s" % project.get("name")))
|
okozachenko1203 | 5fd8a30 | 2022-04-07 01:55:29 +1000 | [diff] [blame] | 24 | self.conn = self.conn_list[project_id]
|
| 25 |
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 26 | # user
|
| 27 | def get_user_id(self):
|
| 28 | user_name = self.conn.config.auth["username"]
|
| 29 | if "user_domain_id" in self.conn.config.auth:
|
| 30 | domain_id = self.conn.config.auth["user_domain_id"]
|
| 31 | user = self.conn.get_user(name_or_id=user_name, domain_id=domain_id)
|
| 32 | elif "user_domain_name" in self.conn.config.auth:
|
| 33 | domain_name = self.conn.config.auth["user_domain_name"]
|
| 34 | user = self.conn.get_user(name_or_id=user_name, domain_id=domain_name)
|
| 35 | else:
|
| 36 | user = self.conn.get_user(name_or_id=user_name)
|
| 37 | return user.id
|
| 38 |
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 39 | def get_projects(self):
|
| 40 | return self.conn.list_projects()
|
okozachenko | 2ab48e8 | 2021-05-07 16:55:11 +0300 | [diff] [blame] | 41 |
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 42 | def get_servers(self, project_id, all_projects=True, details=True):
|
| 43 | return self.conn.compute.servers(
|
| 44 | details=details, all_projects=all_projects, project_id=project_id
|
| 45 | )
|
okozachenko | 2ab48e8 | 2021-05-07 16:55:11 +0300 | [diff] [blame] | 46 |
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 47 | def get_volume(self, uuid, project_id):
|
| 48 | return self.conn.get_volume_by_id(uuid)
|
okozachenko | 2ab48e8 | 2021-05-07 16:55:11 +0300 | [diff] [blame] | 49 |
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 50 | def get_backup(self, uuid, project_id=None):
|
| 51 | # return conn.block_storage.get_backup(
|
| 52 | # project_id=project_id, backup_id=uuid,
|
| 53 | # )
|
| 54 | # conn.block_storage.backups(volume_id=uuid,project_id=project_id)
|
okozachenko | 6302495 | 2021-05-10 20:04:25 +0300 | [diff] [blame] | 55 | try:
|
| 56 | return self.conn.get_volume_backup(uuid)
|
| 57 | except exceptions.ResourceNotFound:
|
| 58 | return None
|
okozachenko | 2ab48e8 | 2021-05-07 16:55:11 +0300 | [diff] [blame] | 59 |
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 60 | def create_backup(self, volume_id, project_id, force=True, wait=False):
|
| 61 | # return conn.block_storage.create_backup(
|
| 62 | # volume_id=queue.volume_id, force=True, project_id=queue.project_id,
|
| 63 | # )
|
| 64 | return self.conn.create_volume_backup(
|
okozachenko1203 | fa747f2 | 2022-05-16 20:13:54 +1000 | [diff] [blame] | 65 | volume_id=volume_id,
|
| 66 | force=force,
|
| 67 | wait=wait,
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 68 | )
|
okozachenko | 2ab48e8 | 2021-05-07 16:55:11 +0300 | [diff] [blame] | 69 |
|
xuxant02@gmail.com | 79b4397 | 2021-06-21 21:36:57 +0545 | [diff] [blame] | 70 | def delete_backup(self, uuid, project_id=None, force=False):
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 71 | # Note(Alex): v3 is not supporting force delete?
|
| 72 | # conn.block_storage.delete_backup(
|
| 73 | # project_id=project_id, backup_id=uuid,
|
| 74 | # )
|
| 75 | try:
|
| 76 | self.conn.delete_volume_backup(uuid, force=force)
|
| 77 | # TODO(Alex): After delete the backup generator, need to set the volume status again
|
| 78 | except exceptions.ResourceNotFound:
|
okozachenko | 6302495 | 2021-05-10 20:04:25 +0300 | [diff] [blame] | 79 | return None
|
okozachenko | fb38560 | 2021-05-07 19:00:47 +0300 | [diff] [blame] | 80 |
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 81 | def get_backup_quota(self, project_id):
|
| 82 | # quota = conn.get_volume_quotas(project_id)
|
| 83 | quota = self._get_volume_quotas(project_id)
|
| 84 | return quota.backups
|
okozachenko | fb38560 | 2021-05-07 19:00:47 +0300 | [diff] [blame] | 85 |
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 86 | # rewrite openstasdk._block_storage.get_volume_quotas
|
| 87 | # added usage flag
|
| 88 | # ref: https://docs.openstack.org/api-ref/block-storage/v3/?expanded=#show-quota-usage-for-a-project
|
| 89 | def _get_volume_quotas(self, project_id, usage=True):
|
okozachenko1203 | fa747f2 | 2022-05-16 20:13:54 +1000 | [diff] [blame] | 90 | """Get volume quotas for a project
|
okozachenko | fb38560 | 2021-05-07 19:00:47 +0300 | [diff] [blame] | 91 |
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 92 | :param name_or_id: project name or id
|
| 93 | :raises: OpenStackCloudException if it's not a valid project
|
okozachenko | fb38560 | 2021-05-07 19:00:47 +0300 | [diff] [blame] | 94 |
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 95 | :returns: Munch object with the quotas
|
| 96 | """
|
okozachenko | fb38560 | 2021-05-07 19:00:47 +0300 | [diff] [blame] | 97 |
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 98 | if usage:
|
| 99 | resp = self.conn.block_storage.get(
|
okozachenko1203 | fa747f2 | 2022-05-16 20:13:54 +1000 | [diff] [blame] | 100 | "/os-quota-sets/{project_id}?usage=True".format(project_id=project_id)
|
| 101 | )
|
okozachenko | f731e62 | 2021-05-10 17:38:30 +0300 | [diff] [blame] | 102 | else:
|
| 103 | resp = self.conn.block_storage.get(
|
okozachenko1203 | fa747f2 | 2022-05-16 20:13:54 +1000 | [diff] [blame] | 104 | "/os-quota-sets/{project_id}".format(project_id=project_id)
|
| 105 | )
|
| 106 | data = proxy._json_response(resp, error_message="cinder client call failed")
|
| 107 | return self.conn._get_and_munchify("quota_set", data)
|