blob: 2a63e7e8bbd8eebf413aef0d47415f9ba14cb699 [file] [log] [blame]
okozachenko1203ef49f952022-05-16 22:27:28 +10001from openstack import exceptions, proxy
okozachenko12035fd8a302022-04-07 01:55:29 +10002from oslo_log import log
ricolinf796ea82025-03-14 23:18:14 +08003
okozachenko2ab48e82021-05-07 16:55:11 +03004from staffeln.common import auth
okozachenko12035fd8a302022-04-07 01:55:29 +10005from staffeln.i18n import _
6
7LOG = log.getLogger(__name__)
okozachenko2ab48e82021-05-07 16:55:11 +03008
okozachenkof731e622021-05-10 17:38:30 +03009
okozachenko1203fa747f22022-05-16 20:13:54 +100010class OpenstackSDK:
okozachenkof731e622021-05-10 17:38:30 +030011 def __init__(self):
12 self.conn_list = {}
13 self.conn = auth.create_connection()
okozachenko2ab48e82021-05-07 16:55:11 +030014
okozachenkof731e622021-05-10 17:38:30 +030015 def set_project(self, project):
okozachenko1203fa747f22022-05-16 20:13:54 +100016 LOG.debug(_("Connect as project %s" % project.get("name")))
17 project_id = project.get("id")
okozachenko2ab48e82021-05-07 16:55:11 +030018
okozachenko12035fd8a302022-04-07 01:55:29 +100019 if project_id not in self.conn_list:
okozachenko1203fa747f22022-05-16 20:13:54 +100020 LOG.debug(_("Initiate connection for project %s" % project.get("name")))
okozachenkof731e622021-05-10 17:38:30 +030021 conn = self.conn.connect_as_project(project)
okozachenko12035fd8a302022-04-07 01:55:29 +100022 self.conn_list[project_id] = conn
okozachenko1203fa747f22022-05-16 20:13:54 +100023 LOG.debug(_("Connect as project %s" % project.get("name")))
okozachenko12035fd8a302022-04-07 01:55:29 +100024 self.conn = self.conn_list[project_id]
25
okozachenkof731e622021-05-10 17:38:30 +030026 # 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
okozachenkof731e622021-05-10 17:38:30 +030039 def get_projects(self):
40 return self.conn.list_projects()
okozachenko2ab48e82021-05-07 16:55:11 +030041
okozachenkof731e622021-05-10 17:38:30 +030042 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 )
okozachenko2ab48e82021-05-07 16:55:11 +030046
okozachenkof731e622021-05-10 17:38:30 +030047 def get_volume(self, uuid, project_id):
48 return self.conn.get_volume_by_id(uuid)
okozachenko2ab48e82021-05-07 16:55:11 +030049
okozachenkof731e622021-05-10 17:38:30 +030050 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)
okozachenko63024952021-05-10 20:04:25 +030055 try:
56 return self.conn.get_volume_backup(uuid)
57 except exceptions.ResourceNotFound:
58 return None
okozachenko2ab48e82021-05-07 16:55:11 +030059
okozachenkof731e622021-05-10 17:38:30 +030060 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(
okozachenko1203fa747f22022-05-16 20:13:54 +100065 volume_id=volume_id,
66 force=force,
67 wait=wait,
okozachenkof731e622021-05-10 17:38:30 +030068 )
okozachenko2ab48e82021-05-07 16:55:11 +030069
xuxant02@gmail.com79b43972021-06-21 21:36:57 +054570 def delete_backup(self, uuid, project_id=None, force=False):
okozachenkof731e622021-05-10 17:38:30 +030071 # 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:
okozachenko63024952021-05-10 20:04:25 +030079 return None
okozachenkofb385602021-05-07 19:00:47 +030080
okozachenkof731e622021-05-10 17:38:30 +030081 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
okozachenkofb385602021-05-07 19:00:47 +030085
okozachenkof731e622021-05-10 17:38:30 +030086 # 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):
okozachenko1203fa747f22022-05-16 20:13:54 +100090 """Get volume quotas for a project
okozachenkofb385602021-05-07 19:00:47 +030091
okozachenkof731e622021-05-10 17:38:30 +030092 :param name_or_id: project name or id
93 :raises: OpenStackCloudException if it's not a valid project
okozachenkofb385602021-05-07 19:00:47 +030094
okozachenkof731e622021-05-10 17:38:30 +030095 :returns: Munch object with the quotas
96 """
okozachenkofb385602021-05-07 19:00:47 +030097
okozachenkof731e622021-05-10 17:38:30 +030098 if usage:
99 resp = self.conn.block_storage.get(
okozachenko1203fa747f22022-05-16 20:13:54 +1000100 "/os-quota-sets/{project_id}?usage=True".format(project_id=project_id)
101 )
okozachenkof731e622021-05-10 17:38:30 +0300102 else:
103 resp = self.conn.block_storage.get(
okozachenko1203fa747f22022-05-16 20:13:54 +1000104 "/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)