azure-devops/azext_devops/dev/team/project.py (100 lines of code) (raw):

# -------------------------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- from __future__ import print_function import webbrowser from knack.log import get_logger from knack.util import CLIError from azext_devops.devops_sdk.v5_0.core.models import TeamProject from azext_devops.dev.common.operations import wait_for_long_running_operation from azext_devops.dev.common.services import (get_core_client, get_core_client_v51, resolve_instance) from azext_devops.dev.common.uri import uri_quote logger = get_logger(__name__) def create_project(name, organization=None, process=None, source_control='git', description=None, visibility='private', detect=None, open=False): # pylint: disable=redefined-builtin """Create a team project. :param name: Name of the new project. :type name: str :param process: Process to use. Default if not specified. :type process: str :param source_control: Source control type of the initial code repository created. :type source_control: str :param description: Description for the new project. :type description: str :param visibility: Project visibility. :type visibility: str :param open: Open the team project in the default web browser. :type open: bool :rtype: :class:`<TeamProject> <v5_0.core.models.TeamProject>` """ organization = resolve_instance(detect=detect, organization=organization) team_project = TeamProject() team_project.name = name team_project.description = description # private is the only allowed value by vsts right now. team_project.visibility = visibility core_client = get_core_client(organization) # get process template id process_id = None process_list = core_client.get_processes() if process is not None: process_lower = process.lower() for prc in process_list: if prc.name.lower() == process_lower: process_id = prc.id break if process_id is None: raise CLIError('Could not find a process template with name: "{}"'.format(name)) if process_id is None: for prc in process_list: if prc.is_default: process_id = prc.id break if process_id is None: raise CLIError('Could not find a default process template: "{}"'.format(name)) # build capabilities version_control_capabilities = {VERSION_CONTROL_CAPABILITY_ATTRIBUTE_NAME: source_control} process_capabilities = {PROCESS_TEMPLATE_CAPABILITY_TEMPLATE_TYPE_ID_ATTRIBUTE_NAME: process_id} team_project.capabilities = {VERSION_CONTROL_CAPABILITY_NAME: version_control_capabilities, PROCESS_TEMPLATE_CAPABILITY_NAME: process_capabilities} # queue project creation operation_reference = core_client.queue_create_project(project_to_create=team_project) operation = wait_for_long_running_operation(organization, operation_reference.id, 1) status = operation.status.lower() if status == 'failed': raise CLIError('Project creation failed.') if status == 'cancelled': raise CLIError('Project creation was cancelled.') team_project = core_client.get_project(project_id=name, include_capabilities=True) if open: _open_project(team_project) return team_project def delete_project(id, organization=None, detect=None): # pylint: disable=redefined-builtin """Delete team project. :param id: The id of the project to delete. :type id: str """ organization = resolve_instance(detect=detect, organization=organization) core_client = get_core_client(organization) operation_reference = core_client.queue_delete_project(project_id=id) operation = wait_for_long_running_operation(organization, operation_reference.id, 1) status = operation.status.lower() if status == 'failed': raise CLIError('Project deletion failed.') if status == 'cancelled': raise CLIError('Project deletion was cancelled.') print('Deleted project {}'.format(id)) return operation def show_project(project, organization=None, detect=None, open=False): # pylint: disable=redefined-builtin """Show team project. :param project: The id or name of the project to show. :type project: str :param open: Open the team project in the default web browser. :type open: bool :rtype: :class:`<TeamProject> <v5_0.core.models.TeamProject>` """ organization = resolve_instance(detect=detect, organization=organization) core_client = get_core_client(organization) team_project = core_client.get_project(project_id=project, include_capabilities=True) if open: _open_project(team_project) return team_project def list_projects(organization=None, top=None, skip=None, state_filter='all', continuation_token=None, get_default_team_image_url=None, detect=None): """List team projects :param top: Maximum number of results to list. :type top: int :param skip: Number of results to skip. :type skip: int :rtype: list of :class:`<TeamProject> <v5_0.core.models.TeamProject>` """ logger.debug('Opening web page: %s', 'Test CLI Release') logger.debug('__________________________________________________________________________________________________') organization = resolve_instance(detect=detect, organization=organization) core_client = get_core_client_v51(organization) team_projects = core_client.get_projects(state_filter=state_filter, top=top, skip=skip, continuation_token=continuation_token, get_default_team_image_url=get_default_team_image_url) return team_projects def _open_project(project): """Opens the project in the default browser. """ api_segment = '/_apis/' pos = project.url.find(api_segment) if pos >= 0: url = project.url[:pos + 1] + uri_quote(project.name) logger.debug('Opening web page: %s', url) webbrowser.open_new(url=url) else: raise CLIError("Failed to open web browser, due to unrecognized url in response.") # capability keys VERSION_CONTROL_CAPABILITY_NAME = 'versioncontrol' VERSION_CONTROL_CAPABILITY_ATTRIBUTE_NAME = 'sourceControlType' PROCESS_TEMPLATE_CAPABILITY_NAME = 'processTemplate' PROCESS_TEMPLATE_CAPABILITY_TEMPLATE_TYPE_ID_ATTRIBUTE_NAME = 'templateTypeId'