Exemple #1
0
 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
Exemple #2
0
    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
        )
Exemple #3
0
    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()