Пример #1
0
    def PUT(self, cluster_id):
        """:returns: JSONized network configuration for cluster.

        :http: * 200 (OK)
               * 400 (data validation or some of tasks failed)
               * 404 (cluster not found in db)
               * 409 (previous dsnmasq setup is not finished yet)
        """
        cluster, data = self._get_cluster_and_validated_network_data(
            cluster_id)

        self.check_if_network_configuration_locked(cluster)

        task_manager = CheckNetworksTaskManager(cluster_id=cluster.id)
        task = task_manager.execute(data)

        if task.status == consts.TASK_STATUSES.error:
            raise self.http(400, task.message, err_list=task.result)

        nm = objects.Cluster.get_network_manager(cluster)
        admin_nets = nm.get_admin_networks()
        nm.update(cluster, data)

        network_config = self.serializer.serialize_for_cluster(cluster)

        if admin_nets != nm.get_admin_networks():
            try:
                task = UpdateDnsmasqTaskManager().execute()
            except errors.TaskAlreadyRunning:
                raise self.http(409, errors.UpdateDnsmasqTaskIsRunning.message)
            if task.status == consts.TASK_STATUSES.error:
                raise self.http(400, task.message)

        return network_config
Пример #2
0
    def remove_cluster_resp(cls, **kwargs):
        logger.info(
            "RPC method remove_cluster_resp received: %s" %
            jsonutils.dumps(kwargs)
        )
        task_uuid = kwargs.get('task_uuid')

        # in remove_nodes_resp method all objects are already locked
        cls.remove_nodes_resp(**kwargs)

        task = objects.Task.get_by_uuid(task_uuid, fail_if_not_found=True)
        cluster = task.cluster

        if task.status in ('ready',):
            logger.debug("Removing environment itself")
            cluster_name = cluster.name

            ips = db().query(IPAddr).filter(
                IPAddr.network.in_([n.id for n in cluster.network_groups])
            )
            map(db().delete, ips)
            db().flush()

            nm = objects.Cluster.get_network_manager(cluster)
            admin_nets = nm.get_admin_networks()
            objects.Cluster.delete(cluster)
            if admin_nets != nm.get_admin_networks():
                # import it here due to cyclic dependencies problem
                from nailgun.task.manager import UpdateDnsmasqTaskManager
                UpdateDnsmasqTaskManager().execute()

            notifier.notify(
                "done",
                u"Environment '%s' and all its nodes are deleted" % (
                    cluster_name
                )
            )

        elif task.status in ('error',):
            cluster.status = 'error'
            db().add(cluster)
            db().flush()
            if not task.message:
                task.message = "Failed to delete nodes:\n{0}".format(
                    cls._generate_error_message(
                        task,
                        error_types=('deletion',)
                    )
                )
            notifier.notify(
                "error",
                task.message,
                cluster.id
            )
Пример #3
0
    def PUT(self, cluster_id):
        """:returns: JSONized network configuration for cluster.

        :http: * 200 (OK)
               * 400 (data validation or some of tasks failed)
               * 404 (cluster not found in db)
               * 409 (previous dsnmasq setup is not finished yet)
        """
        cluster = self.get_object_or_404(objects.Cluster, cluster_id)
        self.check_net_provider(cluster)

        self.check_if_network_configuration_locked(cluster)

        data = self.checked_data(self.validator.validate_networks_data,
                                 data=web.data(),
                                 cluster=cluster,
                                 networks_required=False)

        task_manager = CheckNetworksTaskManager(cluster_id=cluster.id)
        task = task_manager.execute(data)

        if task.status == consts.TASK_STATUSES.error:
            raise self.http(400, task.message, err_list=task.result)

        nm = objects.Cluster.get_network_manager(cluster)
        admin_nets = nm.get_admin_networks()
        nm.update(cluster, data)

        try:
            network_config = self.serializer.serialize_for_cluster(cluster)
        except errors.OutOfIPs as exc:
            network_id = getattr(exc, 'network_id', None)
            raise self.http(400,
                            six.text_type(exc),
                            err_list=[{
                                "errors": ["ip_ranges"],
                                "ids": [network_id]
                            }])

        if admin_nets != nm.get_admin_networks():
            try:
                task = UpdateDnsmasqTaskManager().execute()
            except errors.TaskAlreadyRunning:
                raise self.http(409, errors.UpdateDnsmasqTaskIsRunning.message)
            if task.status == consts.TASK_STATUSES.error:
                raise self.http(400, task.message)

        return network_config
Пример #4
0
    def DELETE(self, group_id):
        """:returns: {}

        :http: * 204 (object successfully deleted)
               * 400 (data validation or some of tasks failed)
               * 404 (nodegroup not found in db)
               * 409 (previous dsnmasq setup is not finished yet)
        """
        node_group = self.get_object_or_404(objects.NodeGroup, group_id)
        db().delete(node_group)
        db().flush()
        try:
            task = UpdateDnsmasqTaskManager().execute()
        except errors.TaskAlreadyRunning as exc:
            raise self.http(409, six.text_type(exc))
        if task.status == consts.TASK_STATUSES.error:
            raise self.http(400, task.message)
        raise web.webapi.HTTPError(status="204 No Content", data="")
Пример #5
0
    def DELETE(self, group_id):
        """:returns: {}

        :http: * 204 (object successfully deleted)
               * 400 (data validation or some of tasks failed)
               * 404 (nodegroup not found in db)
               * 409 (previous dsnmasq setup is not finished yet)
        """
        node_group = self.get_object_or_404(objects.NodeGroup, group_id)

        self.checked_data(self.validator.validate_delete, instance=node_group)

        db().delete(node_group)
        db().flush()
        try:
            task = UpdateDnsmasqTaskManager().execute()
        except errors.TaskAlreadyRunning:
            raise self.http(409, errors.UpdateDnsmasqTaskIsRunning.message)
        if task.status == consts.TASK_STATUSES.error:
            raise self.http(400, task.message)
        raise self.http(204)