You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2019/07/06 09:27:30 UTC

[libcloud] 05/06: Retrieve list of projects lazily on first access to self.projects variable instead of doing it inside the constructor.

This is an automated email from the ASF dual-hosted git repository.

tomaz pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/libcloud.git

commit 8e2e9b18d0db61cb16947ce00f227c76e944f13c
Author: Tomaz Muraus <to...@tomaz.me>
AuthorDate: Thu Jul 4 23:34:35 2019 +0200

    Retrieve list of projects lazily on first access to self.projects
    variable instead of doing it inside the constructor.
    
    Also perform project_id assignment lazily as part of the same method.
---
 libcloud/compute/drivers/packet.py | 56 ++++++++++++++++++++++++++++++--------
 1 file changed, 44 insertions(+), 12 deletions(-)

diff --git a/libcloud/compute/drivers/packet.py b/libcloud/compute/drivers/packet.py
index 683c844..86521d6 100644
--- a/libcloud/compute/drivers/packet.py
+++ b/libcloud/compute/drivers/packet.py
@@ -100,21 +100,53 @@ class PacketNodeDriver(NodeDriver):
                       'active': NodeState.RUNNING}
 
     def __init__(self, key, project=None):
-        # initialize a NodeDriver for Packet using the API token
-        # and optionally the project (name or id)
-        # If project specified we need to be sure this is a valid project
-        # so we create the variable self.project_id
+        """
+        Initialize a NodeDriver for Packet using the API token
+        and optionally the project (name or id).
+
+        If project name is specified we validate it lazily and populate
+        self.project_id during the first access of self.projects variable
+        """
         super(PacketNodeDriver, self).__init__(key=key)
+
         self.project_name = project
         self.project_id = None
-        self.projects = self.ex_list_projects()
-        if project:
-            for project_obj in self.projects:
-                if project in [project_obj.name, project_obj.id]:
-                    self.project_id = project_obj.id
-                    break
-            if not self.project_id:
-                self.project_name = None
+
+        # Lazily populated on first access to self.project
+        self._project = project
+
+        # Variable which indicates if self._projects has been populated yet and
+        # has been called self._project validated
+        self._projects_populated = False
+        self._projects = None
+
+    @property
+    def projects(self):
+        """
+        Lazily retrieve projects and set self.project_id variable on initial
+        access to self.projects variable.
+        """
+        if not self._projects_populated:
+            # NOTE: Each Packet account needs at least one project, but to be
+            # on the safe side and avoid infinite loop in case there are no
+            # projects on the account, we don't use a more robust way to
+            # determine if project list has been populated yet
+            self._projects = self.ex_list_projects()
+            self._projects_populated = True
+
+            # If project name is specified, verify it's valid and populate
+            # self.project_id
+            if self._project:
+                for project_obj in self._projects:
+                    if self._project in [project_obj.name, project_obj.id]:
+                        self.project_id = project_obj.id
+                        break
+
+                if not self.project_id:
+                    # Invalid project name
+                    self.project_name = None
+
+        return self._projects
 
     def ex_list_projects(self):
         projects = []