def driver(self): """ Find the underlying libcloud driver and marshall the arguments to it from whatever is provided in the source yay, by inspection of the call signature of the driver. """ # This used get_driver_from_expression which has some nice # diff logic we should reuse params = self.original.driver_params Driver = self.driver_class() kwargs = getattr(Driver, "kwargs", []) args = args_from_expression(Driver, params, ignore=(), kwargs=kwargs) driver = Driver(**args) driver.yaybu_context = self.original.root return driver
def create(self): kwargs = args_from_expression(self.driver.create_node, self.original.params, ignore=( "name", "image", "size"), kwargs=getattr(self.driver, "create_node_kwargs", [])) if 'ex_keyname' not in kwargs: kwargs['auth'] = self._get_auth() if 'ex_iamprofile' in kwargs: kwargs['ex_iamprofile'] = kwargs['ex_iamprofile'].encode("utf-8") image = self._get_image_from_id(self.original.params.image.as_string()) size = self._get_size() self.pending_node = self.driver.create_node( name=self.original.full_name, image=image, state=self.original.state, size=size, **kwargs )
def apply(self): if self.libcloud_node: return self.state.refresh() if "their_name" in self.state: self.libcloud_node = self._find_node(self.state.their_name) if not self.libcloud_node: self.libcloud_node = self._find_node(self.full_name) if self.libcloud_node: logger.debug("Applying to node %r at %r/%r" % (self.libcloud_node.name, self.libcloud_node.public_ip, self.libcloud_node.private_ip)) self._update_node_info() return if self.root.readonly: self._fake_node_info() return logger.debug("Node will be %r" % self.full_name) for tries in range(10): logger.debug("Creating %r, attempt %d" % (self.full_name, tries)) with self.root.ui.throbber(_("Create node '%r'") % (self.full_name, )): kwargs = args_from_expression(self.driver.create_node, self.params, ignore=( "name", "image", "size"), kwargs=getattr(self.driver, "create_node_kwargs", [])) if not 'ex_keyname' in kwargs: kwargs['auth'] = self._get_auth() if 'ex_iamprofile' in kwargs: kwargs['ex_iamprofile'] = kwargs['ex_iamprofile'].encode("utf-8") if self.root.simulate: self._fake_node_info() self.root.changed() return node = self.driver.create_node( name=self.full_name, image=self._get_image(), size=self._get_size(), **kwargs ) logger.debug("Waiting for node %r to start" % (self.full_name, )) try: with self.root.ui.throbber(_("Wait for node '%r' to start") % self.full_name): self.libcloud_node, self.ip_addresses = self.driver.wait_until_running( [node], wait_period=1, timeout=600)[0] logger.debug("Node %r running" % (self.full_name, )) # self.their_name = self.libcloud_node.name self._update_node_info() self.root.changed() return except LibcloudError as e: logger.warning( "Node %r did not start before timeout. retrying." % self.full_name) node.destroy() continue except Exception as e: logger.warning( "Node %r had an unexpected error %s - node will be cleaned up and processing will stop" % (self.full_name, e)) node.destroy() raise return logger.error("Unable to create node successfully. giving up.") raise IOError()