Example #1
0
    def test_list_image_tags(self, requests_mock):
        requests_mock.get(
            ANY,
            json={
                "code": 0,
                "data": {
                    "totalRecords":
                    10,
                    "records": [{
                        "tag": "latest",
                        "stageTag": "",
                        "size": 527,
                        "lastModifiedBy": fake_username,
                        "lastModifiedDate": "2021-10-29T15:48:55.121",
                        "downloadCount": 0,
                    }],
                },
            },
        )

        client = bk_repo.BkRepoClient(username=fake_username,
                                      password=fake_pwd)
        resp_data = client.list_image_tags(fake_project_code,
                                           fake_project_code, "test",
                                           bk_repo.PageData())
        assert requests_mock.called
        assert resp_data["totalRecords"] == 10
        assert resp_data["records"][0]["tag"] == "latest"
Example #2
0
    def test_delete_chart_version_error(self, requests_mock):
        requests_mock.delete(ANY, json={"error": "error message"})

        client = bk_repo.BkRepoClient(fake_username, password=fake_pwd)
        with pytest.raises(bk_repo.BkRepoDeleteVersionError):
            client.delete_chart_version(fake_project_code, fake_project_code,
                                        fake_chart_name, fake_chart_version)
Example #3
0
    def test_list_images(self, requests_mock):
        requests_mock.get(
            ANY,
            json={
                "code": 0,
                "data": {
                    "totalRecords":
                    10,
                    "records": [{
                        "name": "busybox",
                        "lastModifiedBy": fake_username,
                        "lastModifiedDate": "2021-10-29T15:48:55.121",
                        "downloadCount": 0,
                        "logoUrl": "",
                        "description": "",
                    }],
                },
            },
        )

        client = bk_repo.BkRepoClient(username=fake_username,
                                      password=fake_pwd)
        resp_data = client.list_images(fake_project_code, fake_project_code,
                                       bk_repo.PageData())
        assert requests_mock.called
        assert resp_data["totalRecords"] == 10
        assert resp_data["records"][0]["name"] == "busybox"
Example #4
0
    def test_set_auth(self, requests_mock):
        requests_mock.post(ANY, json={"result": True, "data": {"foo": "bar"}})

        client = bk_repo.BkRepoClient(fake_username, access_token=fake_access_token)
        resp_data = client.set_auth(fake_project_code, fake_username, fake_pwd)
        assert resp_data == {"foo": "bar"}
        assert requests_mock.request_history[0].method == "POST"
Example #5
0
    def test_list_charts(self, requests_mock):
        requests_mock.get(ANY, json={"foo": "bar"})

        client = bk_repo.BkRepoClient(fake_username, password=fake_pwd)
        resp_data = client.list_charts(fake_project_code, fake_project_code)
        assert resp_data == {"foo": "bar"}
        assert requests_mock.called
Example #6
0
    def test_create_chart_repo_ok(self, raw_resp, expected_resp, requests_mock):
        requests_mock.post(ANY, json=raw_resp)

        client = bk_repo.BkRepoClient(fake_username, access_token=fake_access_token)
        resp_data = client.create_chart_repo(fake_project_code)
        assert resp_data == raw_resp
        assert requests_mock.request_history[0].method == "POST"
Example #7
0
    def test_create_project_ok(self, raw_resp, expected_resp, requests_mock):
        requests_mock.post(ANY, json=raw_resp)

        client = bk_repo.BkRepoClient(fake_username, access_token=fake_access_token)
        resp_data = client.create_project(fake_project_code, fake_project_name, fake_project_description)
        assert resp_data == expected_resp
        assert requests_mock.called
Example #8
0
    def test_get_chart_versions(self, requests_mock):
        requests_mock.get(ANY, json={"foo": "bar"})

        client = bk_repo.BkRepoClient(fake_username, password=fake_pwd)
        resp_data = client.get_chart_versions(fake_project_code, fake_project_code, fake_chart_name)
        assert resp_data == {"foo": "bar"}
        assert requests_mock.called
        assert requests_mock.request_history[0].method == "GET"
Example #9
0
    def test_delete_chart_version_ok(self, raw_resp, expected_resp, requests_mock):
        requests_mock.delete(ANY, json=raw_resp)

        client = bk_repo.BkRepoClient(fake_username, password=fake_pwd)
        resp = client.delete_chart_version(fake_project_code, fake_project_code, fake_chart_name, fake_chart_version)
        assert resp == expected_resp
        assert requests_mock.called
        assert requests_mock.request_history[0].method == "DELETE"
Example #10
0
 def _delete_version(self, username: str, pwd: str, project_code: str,
                     name: str, version: str):
     # 兼容harbor中chart仓库项目名称
     project_name = DEFAULT_CHART_REPO_PROJECT_NAME or project_code
     try:
         client = bk_repo.BkRepoClient(username, password=pwd)
         client.delete_chart_version(project_name, project_code, name,
                                     version)
     except bk_repo.BkRepoDeleteVersionError as e:
         raise error_codes.APIError(
             f"delete chart: {name} version: {version} failed, {e}")
Example #11
0
    def test_create_repo_error(self, requests_mock):
        requests_mock.post(ANY,
                           json={
                               "code": fake_error_code,
                               "messahe": "error message"
                           })

        client = bk_repo.BkRepoClient(username=fake_username,
                                      access_token=fake_access_token)
        with pytest.raises(bk_repo.BkRepoCreateRepoError):
            client.create_repo(fake_project_code)
Example #12
0
def create_bkrepo_project_and_depot(project: FancyDict, username: str):
    """创建制品库项目及镜像仓库"""
    client = bk_repo.BkRepoClient()
    # 创建项目
    try:
        client.create_project(project.project_code, project.project_name,
                              project.description)
    except bk_repo.BkRepoCreateProjectError as e:
        logger.error("创建制品库的项目失败: %s", e)
    # 创建镜像仓库
    try:
        client.create_repo(f"{project.project_code}-docker",
                           repo_type="DOCKER")
    except bk_repo.BkRepoCreateRepoError as e:
        logger.error("创建制品库的镜像仓库失败: %s", e)
Example #13
0
def get_or_create_private_repo(user: User, project: FancyDict):
    access_token = user.token.access_token
    username = user.username
    project_code = project.english_name
    project_id = project.project_id
    private_repos = Repository.objects.filter(name=project_code,
                                              project_id=project_id)
    # 当仓库和角色权限创建后,则直接返回
    repo = private_repos.first()
    if repo and RepositoryAuth.objects.filter(repo=repo).exists():
        return repo
    repo_client = bk_repo.BkRepoClient(username=username,
                                       access_token=access_token)
    if not repo:
        # 创建bkrepo项目
        try:
            repo_client.create_project(project_code, project.project_name,
                                       project.description)
        except bk_repo.BkRepoCreateProjectError as e:
            raise error_codes.APIError(f"create bk repo project error, {e}")
        # 创建helm repo
        try:
            repo_client.create_repo(project_code)
        except bk_repo.BkRepoCreateRepoError as e:
            raise error_codes.APIError(f"create bk repo error, {e}")
        # db中存储repo信息
        repo_params = {
            "url":
            f"{settings.HELM_REPO_DOMAIN}/{project_code}/{project_code}/",
            "provider": "bkrepo",
            "storage_info": {},
        }
        repo = Repository.objects.get_or_create(name=project_code,
                                                project_id=project_id,
                                                defaults=repo_params)[0]
    # 创建admin账号
    role_list = ["admin"]
    for role in role_list:
        basic_auth = BasicAuthGenerator().generate_basic_auth_by_role(role)
        repo_auth_params = {"type": "basic", "credentials": basic_auth}
        repo_client.set_auth(project_code, basic_auth["username"],
                             basic_auth["password"])
        RepositoryAuth.objects.get_or_create(repo=repo,
                                             role=role,
                                             defaults=repo_auth_params)

    return repo