Esempio n. 1
0
def project_delete(project_id):
    logger.debug("entered delete({args})".format(args=locals()))

    if not proj_exists(project_id):
        raise exc.UserNotFound("there's no project to delete with id {id}".format(id=project_id))

    try:
        project = project_listing(project_id)[0] # could possibly be used for rollback?
        db.pipe.delete(proj_key(project_id)).execute()
    except Exception as e:
        logger.debug("failed to remove project from db because %s" % e, exc_info=True)
        raise exc.SystemInvalid()

    try:
        c = docker.get_client(host_url="tcp://docker1:2375")
        docker.delete_all_containers_from_proj(docker_client=c, project_name=project["name"])
        return {"project_id": project_id, "state": "destroyed"}

    except APIError as e:
        if e.is_client_error() and "No such container" in e.explanation:
            logger.error("docker says : {s}".format(s=e.explanation))
            raise exc.SystemInvalid("couldn't find project container(s) to delete...")
        else:
            raise exc.SystemInvalid("couldn't delete project container(s) because %s" % e.explanation)


    except Exception as e:
        logger.error("failed to delete project containers from docker because %s" % e, exc_info=True)
        raise exc.SystemInvalid()  # now rollback?
Esempio n. 2
0
def project_listing(project_id=None):
    logger.debug("entered listing({args})".format(args=locals()))

    if project_id:
        if not proj_exists(project_id):
            raise exc.UserNotFound("no project with id {i}".format(id=project_id))
        else:
            results = db.pipe.get(name=proj_key(project_id)).execute()
            logger.debug("retrieved results {r}".format(r=results))
    else:
        try:  # pull all projects
            project_names = db.keys("projects:project:*") or []
            logger.debug("returning list of all projects: {p}".format(p=project_names))
            for project in project_names:
                db.pipe.get(name=project["name"])

            results = db.pipe.execute()
        except Exception as e:
            logger.error("failed to pull projects because %s" % e, exc_info=True)
            raise exc.SystemInvalid()

    projects = [json.loads(project) for project in results]
    c = docker.get_client(host_url="tcp://docker1:2375")
    for project in projects:
        if 'containers' in project:
            for container in project['containers']:
                container['info'] = docker.get_container_info(docker_client=c, project_name=project['name'], container_name=container['name'])
    logger.debug("returning project(s) {p}".format(p=projects))
    return projects
Esempio n. 3
0
def project_create(name, containers, version, project_id=None):
    new_project_id = str(int(project_id or time()))

    if proj_exists(new_project_id):
        new_project_id = str(int(time()) + 1)
    else:
        logger.debug("project {p} exists, updating".format(p=project_id))

    try:
        project = {"id": new_project_id, "name": name, "version": version, "containers": containers}
        db.pipe.set(name=proj_key(new_project_id), value=json.dumps(project)).execute()
        c = docker.get_client(host_url="tcp://docker1:2375")
        docker.create_containers_from_proj(docker_client=c, project_name=name, project_containers=containers)

    except APIError as e:
        if e.is_client_error():
            if "409" in str(e.response):
                raise exc.UserInvalidUsage("Project name '{n}' is already taken".format(n=name))
            else:
                raise exc.UserInvalidUsage("failed because {s}".format(s=e.explanation))

        else:
            raise exc.SystemInvalid("unable to create new project because {s}".format(s=e.explanation))

    except Exception as e:
        logger.error("failed to create new project because %s" % e, exc_info=True)
        # TODO rollback on error, deleting keys possibly created
        raise exc.SystemInvalid()

    return {"project_id": new_project_id, "state": "created"}