azure-devops/azext_devops/dev/team/service_endpoint.py (141 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 os from knack.log import get_logger from knack.prompting import prompt_pass from knack.util import CLIError from azext_devops.devops_sdk.v5_0.service_endpoint.models import ServiceEndpoint, EndpointAuthorization from azext_devops.dev.common.services import get_service_endpoint_client, resolve_instance_and_project from azext_devops.dev.common.const import CLI_ENV_VARIABLE_PREFIX, AZ_DEVOPS_GITHUB_PAT_ENVKEY from azext_devops.dev.common.prompting import verify_is_a_tty_or_raise_error from .const import (SERVICE_ENDPOINT_AUTHORIZATION_PERSONAL_ACCESS_TOKEN, SERVICE_ENDPOINT_TYPE_GITHUB, SERVICE_ENDPOINT_AUTHORIZATION_SERVICE_PRINCIPAL, SERVICE_ENDPOINT_TYPE_AZURE_RM) logger = get_logger(__name__) # pylint: disable=too-few-public-methods, too-many-instance-attributes class ServiceEndpointAuthorized(): _attribute_map = { 'service_endpoint_parameters': {'key': 'service_endpoint_parameters', 'type': 'ServiceEndpoint'}, 'authorized': {'key': 'authorized', 'type': 'bool'} } def __init__(self, service_endpoint_parameters, authorized): self.authorized = authorized if authorized is not None else False self.administratorsGroup = service_endpoint_parameters.administrators_group self.authorization = service_endpoint_parameters.authorization self.createdBy = service_endpoint_parameters.created_by self.data = service_endpoint_parameters.data self.description = service_endpoint_parameters.description self.groupScopeId = service_endpoint_parameters.group_scope_id self.id = service_endpoint_parameters.id self.isReady = service_endpoint_parameters.is_ready self.isShared = service_endpoint_parameters.is_shared self.name = service_endpoint_parameters.name self.operationStatus = service_endpoint_parameters.operation_status self.owner = service_endpoint_parameters.owner self.readersGroup = service_endpoint_parameters.readers_group self.type = service_endpoint_parameters.type self.url = service_endpoint_parameters.url def list_service_endpoints(organization=None, project=None, detect=None): """List service endpoints in a project. :rtype: list of :class:`VssJsonCollectionWrapper <service_endpoint.v4_1.models.ServiceEndpoint>` """ organization, project = resolve_instance_and_project(detect=detect, organization=organization, project=project) client = get_service_endpoint_client(organization) return client.get_service_endpoints(project) def show_service_endpoint(id, organization=None, project=None, detect=None): # pylint: disable=redefined-builtin """Get the details of a service endpoint. :param id: ID of the service endpoint. :type id: str :rtype: :class:`ServiceEndpoint <service_endpoint.v4_1.models.ServiceEndpoint>` """ organization, project = resolve_instance_and_project(detect=detect, organization=organization, project=project) client = get_service_endpoint_client(organization) return client.get_service_endpoint_details(project, id) def delete_service_endpoint(id, deep=False, organization=None, project=None, detect=None): # pylint: disable=redefined-builtin """Deletes service endpoint :param id: Id of the service endpoint to delete. :type id: str :param deep: Specific to AzureRM endpoint created in Automatic flow. When it is specified, this will also delete corresponding AAD application in Azure. :type deep: bool """ organization, project = resolve_instance_and_project(detect=detect, organization=organization, project=project) client = get_service_endpoint_client(organization) return client.delete_service_endpoint(project, id, deep) def create_azurerm_service_endpoint(name, azure_rm_tenant_id, azure_rm_service_principal_id, azure_rm_subscription_id, azure_rm_subscription_name, azure_rm_service_principal_certificate_path=None, organization=None, project=None, detect=None): """ Create an Azure RM type service endpoint. :param name: Name of service endpoint to create :type name: str :param azure_rm_tenant_id: tenant id for creating azure rm service endpoint :type azure_rm_tenant_id: str :param azure_rm_service_principal_id: service principal id for creating azure rm service endpoint :type azure_rm_service_principal_id: str :param azure_rm_subscription_id: subscription id for azure rm service endpoint :type azure_rm_subscription_id: str :param azure_rm_service_principal_certificate_path: Path to (.pem) which is certificate. Create using command "openssl pkcs12 -in file.pfx -out file.pem -nodes -password pass:<password_here>". More details : https://aka.ms/azure-devops-cli-azurerm-service-endpoint :type azure_rm_service_principal_certificate_path: str :param azure_rm_subscription_name: name of azure subscription for azure rm service endpoint :type azure_rm_subscription_name: str :rtype: :class:`ServiceEndpoint <service_endpoint.v4_1.models.ServiceEndpoint>` """ organization, project = resolve_instance_and_project(detect=detect, organization=organization, project=project) client = get_service_endpoint_client(organization) service_endpoint_authorization = EndpointAuthorization( parameters={'tenantid': azure_rm_tenant_id, 'serviceprincipalid': azure_rm_service_principal_id}, scheme=SERVICE_ENDPOINT_AUTHORIZATION_SERVICE_PRINCIPAL) if azure_rm_service_principal_certificate_path is None: AZURE_RM_SP_KEY_END_VARIABLE_NAME = CLI_ENV_VARIABLE_PREFIX + 'AZURE_RM_SERVICE_PRINCIPAL_KEY' if AZURE_RM_SP_KEY_END_VARIABLE_NAME not in os.environ: error_message = 'Please specify azure service principal key in ' + AZURE_RM_SP_KEY_END_VARIABLE_NAME +\ ' environment variable in non-interactive mode or use ' +\ '--azure-rm-service-principal-certificate-path.' verify_is_a_tty_or_raise_error(error_message) azure_rm_service_principal_key = prompt_pass('Azure RM service principal key:', confirm=True) else: logger.debug('Picking Azure RM principal key from environment variable') azure_rm_service_principal_key = os.environ[AZURE_RM_SP_KEY_END_VARIABLE_NAME] service_endpoint_authorization.parameters['authenticationType'] = 'spnKey' service_endpoint_authorization.parameters['serviceprincipalkey'] = azure_rm_service_principal_key else: with open(azure_rm_service_principal_certificate_path, "r") as f: service_endpoint_authorization.parameters['authenticationType'] = 'spnCertificate' service_endpoint_authorization.parameters['servicePrincipalCertificate'] = f.read() service_endpoint_data = { 'subscriptionId': azure_rm_subscription_id, 'subscriptionName': azure_rm_subscription_name, 'environment': 'AzureCloud', 'creationMode': 'Manual' } service_endpoint_to_create = ServiceEndpoint( authorization=service_endpoint_authorization, data=service_endpoint_data, name=name, type=SERVICE_ENDPOINT_TYPE_AZURE_RM, url='https://management.azure.com/') return client.create_service_endpoint(service_endpoint_to_create, project) def create_github_service_endpoint(name, github_url, organization=None, project=None, detect=None): """ Create a GitHub service endpoint. :param name: Name of service endpoint to create :type name: str :param github_url: Url for github for creating service endpoint :type github_url: str :rtype: :class:`ServiceEndpoint <service_endpoint.v4_1.models.ServiceEndpoint>` """ organization, project = resolve_instance_and_project(detect=detect, organization=organization, project=project) client = get_service_endpoint_client(organization) if AZ_DEVOPS_GITHUB_PAT_ENVKEY not in os.environ: error_message = 'Please pass GitHub access token in ' + AZ_DEVOPS_GITHUB_PAT_ENVKEY +\ ' environment variable in non-interactive mode.' verify_is_a_tty_or_raise_error(error_message) github_access_token = prompt_pass('GitHub access token:', confirm=True) else: logger.debug('Picking GitHub PAT from environment variable') github_access_token = os.environ[AZ_DEVOPS_GITHUB_PAT_ENVKEY] service_endpoint_authorization = EndpointAuthorization( parameters={'accessToken': github_access_token}, scheme=SERVICE_ENDPOINT_AUTHORIZATION_PERSONAL_ACCESS_TOKEN) service_endpoint_to_create = ServiceEndpoint( authorization=service_endpoint_authorization, name=name, type=SERVICE_ENDPOINT_TYPE_GITHUB, url=github_url) return client.create_service_endpoint(service_endpoint_to_create, project) def create_service_endpoint(service_endpoint_configuration, encoding='utf-8', organization=None, project=None, detect=None): """Create a service endpoint using configuration file. :param name: Name of service endpoint to create :type name: str :param service_endpoint_configuration: Configuration file with service endpoint request. :type service_endpoint_configuration: str :rtype: :class:`ServiceEndpoint <service_endpoint.v4_1.models.ServiceEndpoint>` """ organization, project = resolve_instance_and_project(detect=detect, organization=organization, project=project) client = get_service_endpoint_client(organization) from azext_devops.dev.common.utils import read_file_content in_file_content = read_file_content(file_path=service_endpoint_configuration, encoding=encoding) import json service_endpoint_to_create = json.loads(in_file_content) return client.create_service_endpoint(service_endpoint_to_create, project) def update_service_endpoint(id, enable_for_all=None, organization=None, # pylint: disable=redefined-builtin project=None, detect=None): """Update a service endpoint :param id: ID of the service endpoint. :type id: str """ if enable_for_all is None: raise CLIError('Atleast one property to be updated must be specified.') organization, project = resolve_instance_and_project(detect=detect, organization=organization, project=project) client = get_service_endpoint_client(organization) se = client.get_service_endpoint_details(project, id) # set authorization if get service endpoint succeeded from azext_devops.dev.pipelines.pipeline_utils import set_authorize_resource, get_authorize_resource set_authorize_resource( authorized=enable_for_all, res_id=se.id, name=se.name, res_type='endpoint', organization=organization, project=project) authorized = get_authorize_resource(res_id=se.id, res_type='endpoint', organization=organization, project=project) return ServiceEndpointAuthorized(service_endpoint_parameters=se, authorized=authorized)